远程 Powershell 脚本无法安装 .exe
Remote Powershell script fails to install .exe
EDIT2:**经过大量测试和阅读,我意识到这是一个 powershell 限制 "environmental snag."(read more here). I've resolved the issue by running the .exe as a task via schtasks.exe **
编辑:经过大量测试后,问题似乎是由远程 PowerShell 和本地 PowerShell 之间的差异引起的...问题仍未解决,因此非常欢迎任何帮助!
我正在尝试做一些相当简单的事情,但这对我来说不起作用。
我有 2 台机器,MachineA 和 MachineB。两者都运行 PowerShell v2,并且是启用远程处理的彼此信任的来源。
我正在尝试通过以下命令通过 MachineA 在 MachineB 上运行脚本:
invoke-command -computername MachineB { C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -executionpolicy Bypass Script.ps1 }
脚本本身会尝试安装具有静默安装选项的 .exe 文件(基于其目录中的配置文件):
$arguments = "-i silent"
$InstallerPath = "Setup.exe"
Start-Process $InstallerPath5 $arguments5 -verb runas
当我在 MachineB 上本地运行脚本时 - 一切正常并且安装成功完成。但是,当我远程运行脚本时(使用来自 MachineA 的第一个命令)它立即完成并且没有任何反应 - 安装程序根本不会在 MachineB 的任务管理器中打开。没有产生错误,也没有日志。
有趣的是,当我将实际脚本更改为“& C:\Windows\system32\cmd.exe /c Setup.exe -i silent”并远程运行时,安装程序启动,适用于 5- 50% cpu 利用率 6 秒,然后变为 0% 并永远挂起。同样,如果我在本地运行它,一切都会完美...
如果尝试过:
- 直接远程运行安装程序(例如通过
invoke-command { & Setup.exe -i }
)
- 编辑脚本以在没有 Start-Process 的情况下运行(例如
& Setup.exe -i
)
- 将脚本移动到 MachineA 并远程运行到 MachineB(例如
invoke-command -filename sciprt.ps1 -computername MachineB
)
如果我在 MachineB 上本地执行所有这些工作,但如果通过 MachineA 远程完成则没有工作(虽然有不同的问题)?我要疯了。
我还通过这个检查了 remoteshell 是否具有管理员权限:
([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
它 returns 是的。另外,我可以远程编辑 HKLM 注册表,因此我认为它可以正常工作。
此时欢迎任何想法!
经过大量测试和阅读后,我意识到这是 powershell 的限制 "environmental snag." (read more here). I've resolved the issue by running the .exe as a task via schtasks.exe
我最近一直在玩这个。我为几百台机器做了很多远程处理和安装软件。我们遇到了一个问题,即用户 Java 在每次重新启动时都会被删除。无论如何,从他们那里获取机器名称然后安装软件可能需要 2-5 分钟。我写了这篇小文章(仍在创作中,但正在工作)所以我只需要他们的用户名,大约 1 分半钟。
import-module ActiveDirectory
$username = Read-Host -prompt 'Username'
$dn = Get-ADUSER $username -properties * | SELECT -expand DistinguishedName
$results = Get-ADCOMPUTER -LDAPFilter "(ManagedBy=$dn)" -properties * | SELECT CN,ManagedBy
$results | Out-Host
$cn = Read-Host -prompt 'Choose a computerName from above'
#Copy the .exe to remote system
$source = 'C:\Scripts\Programs\JavaSetup8u151.exe'
$destination = '\' + $cn + '\C$\Users\' + $username + '\Downloads'
Copy-Item -Recurse -Filter *.* -path $source -destination $destination -Force
#move to psTools directory for remote Install, you will need this directory
#tied into your dir "C:\psTools" for example
cd \psTools
#Ensures that remoting is activated on end client
.\psexec \$cn -s powershell Enable-PSRemoting -Force
#Remote to machine
INVOKE-COMMAND -ComputerName $cn -ScriptBlock {
#Passing in local variable, mainly for directory movement purposes
$username = $using:username
#define SearchVariable to see if already install
$searchTerm = 'Java'
#Setup for uninstall
$app = Get-WMIObject -Class Win32_Product -Filter "Name LIKE '%$searchTerm%'"
IF ($app -eq $null) {
WRITE-HOST 'Currently no programs containing' $searchTerm 'in their name.'
} ELSE {
$app.uninstall()
$app = Get-WMIObject -Class Win32_Product -Filter "Name LIKE '%$searchTerm%'"
IF ($app -eq $null) {
WRITE-HOST 'Successfully deleted all programs containing' $searchTerm '.'
} ELSE {
WRITE-HOST 'Failed to delete all programs containing' $searchTerm '. Please report errors to ADMIN.'
}
}
cd \Users$username\Downloads
#This was just me proving to myself that I was in the right dir and the file was actually copying over
$dir = Get-ChildItem -Force
$dir | Out-Host
#Install
cmd
.\JavaSetup8u151.exe INSTALL_SILENT=1 AUTO_UPDATE=0 REBOOT=0 SPONSORS=0 REMOVEOUTOFDATEJRES=1
Start-Sleep -s 60
#Reset variable so we can see if install was successful or not
$app = Get-WMIObject -Class Win32_Product -Filter "Name LIKE '%$searchTerm%'"
IF ($app -ne $null) {
WRITE-HOST 'You have successfully installed' $searchTerm'.'
} else {
WRITE-HOST 'You have failed to install' $searchTerm'.'
}
}
抱歉,不是很好的复制粘贴代码。我的问题是 exe 不是 运行ning;我认为它是在安装完成之前尝试 运行 IF ELSE 最后检查。 Start-Sleep cmdlet 是我的答案。我 运行 通过 cmd 而不是 ps,但我认为它现在可以双向工作。 'EDIT: Works both ways.'
cmd
.\JavaSetup8u151.exe INSTALL_SILENT=1 AUTO_UPDATE=0 REBOOT=0 SPONSORS=0 REMOVEOUTOFDATEJRES=1
Start-Sleep -s 60
我建议使用:
Enter-PSSession -ComputerName $cn
计算安装所需的时间。 45秒有点害羞,所以我选择了完整的60秒。
EDIT2:**经过大量测试和阅读,我意识到这是一个 powershell 限制 "environmental snag."(read more here). I've resolved the issue by running the .exe as a task via schtasks.exe **
编辑:经过大量测试后,问题似乎是由远程 PowerShell 和本地 PowerShell 之间的差异引起的...问题仍未解决,因此非常欢迎任何帮助!
我正在尝试做一些相当简单的事情,但这对我来说不起作用。
我有 2 台机器,MachineA 和 MachineB。两者都运行 PowerShell v2,并且是启用远程处理的彼此信任的来源。
我正在尝试通过以下命令通过 MachineA 在 MachineB 上运行脚本:
invoke-command -computername MachineB { C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -executionpolicy Bypass Script.ps1 }
脚本本身会尝试安装具有静默安装选项的 .exe 文件(基于其目录中的配置文件):
$arguments = "-i silent"
$InstallerPath = "Setup.exe"
Start-Process $InstallerPath5 $arguments5 -verb runas
当我在 MachineB 上本地运行脚本时 - 一切正常并且安装成功完成。但是,当我远程运行脚本时(使用来自 MachineA 的第一个命令)它立即完成并且没有任何反应 - 安装程序根本不会在 MachineB 的任务管理器中打开。没有产生错误,也没有日志。
有趣的是,当我将实际脚本更改为“& C:\Windows\system32\cmd.exe /c Setup.exe -i silent”并远程运行时,安装程序启动,适用于 5- 50% cpu 利用率 6 秒,然后变为 0% 并永远挂起。同样,如果我在本地运行它,一切都会完美...
如果尝试过:
- 直接远程运行安装程序(例如通过
invoke-command { & Setup.exe -i }
) - 编辑脚本以在没有 Start-Process 的情况下运行(例如
& Setup.exe -i
) - 将脚本移动到 MachineA 并远程运行到 MachineB(例如
invoke-command -filename sciprt.ps1 -computername MachineB
)
如果我在 MachineB 上本地执行所有这些工作,但如果通过 MachineA 远程完成则没有工作(虽然有不同的问题)?我要疯了。
我还通过这个检查了 remoteshell 是否具有管理员权限:
([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
它 returns 是的。另外,我可以远程编辑 HKLM 注册表,因此我认为它可以正常工作。
此时欢迎任何想法!
经过大量测试和阅读后,我意识到这是 powershell 的限制 "environmental snag." (read more here). I've resolved the issue by running the .exe as a task via schtasks.exe
我最近一直在玩这个。我为几百台机器做了很多远程处理和安装软件。我们遇到了一个问题,即用户 Java 在每次重新启动时都会被删除。无论如何,从他们那里获取机器名称然后安装软件可能需要 2-5 分钟。我写了这篇小文章(仍在创作中,但正在工作)所以我只需要他们的用户名,大约 1 分半钟。
import-module ActiveDirectory
$username = Read-Host -prompt 'Username'
$dn = Get-ADUSER $username -properties * | SELECT -expand DistinguishedName
$results = Get-ADCOMPUTER -LDAPFilter "(ManagedBy=$dn)" -properties * | SELECT CN,ManagedBy
$results | Out-Host
$cn = Read-Host -prompt 'Choose a computerName from above'
#Copy the .exe to remote system
$source = 'C:\Scripts\Programs\JavaSetup8u151.exe'
$destination = '\' + $cn + '\C$\Users\' + $username + '\Downloads'
Copy-Item -Recurse -Filter *.* -path $source -destination $destination -Force
#move to psTools directory for remote Install, you will need this directory
#tied into your dir "C:\psTools" for example
cd \psTools
#Ensures that remoting is activated on end client
.\psexec \$cn -s powershell Enable-PSRemoting -Force
#Remote to machine
INVOKE-COMMAND -ComputerName $cn -ScriptBlock {
#Passing in local variable, mainly for directory movement purposes
$username = $using:username
#define SearchVariable to see if already install
$searchTerm = 'Java'
#Setup for uninstall
$app = Get-WMIObject -Class Win32_Product -Filter "Name LIKE '%$searchTerm%'"
IF ($app -eq $null) {
WRITE-HOST 'Currently no programs containing' $searchTerm 'in their name.'
} ELSE {
$app.uninstall()
$app = Get-WMIObject -Class Win32_Product -Filter "Name LIKE '%$searchTerm%'"
IF ($app -eq $null) {
WRITE-HOST 'Successfully deleted all programs containing' $searchTerm '.'
} ELSE {
WRITE-HOST 'Failed to delete all programs containing' $searchTerm '. Please report errors to ADMIN.'
}
}
cd \Users$username\Downloads
#This was just me proving to myself that I was in the right dir and the file was actually copying over
$dir = Get-ChildItem -Force
$dir | Out-Host
#Install
cmd
.\JavaSetup8u151.exe INSTALL_SILENT=1 AUTO_UPDATE=0 REBOOT=0 SPONSORS=0 REMOVEOUTOFDATEJRES=1
Start-Sleep -s 60
#Reset variable so we can see if install was successful or not
$app = Get-WMIObject -Class Win32_Product -Filter "Name LIKE '%$searchTerm%'"
IF ($app -ne $null) {
WRITE-HOST 'You have successfully installed' $searchTerm'.'
} else {
WRITE-HOST 'You have failed to install' $searchTerm'.'
}
}
抱歉,不是很好的复制粘贴代码。我的问题是 exe 不是 运行ning;我认为它是在安装完成之前尝试 运行 IF ELSE 最后检查。 Start-Sleep cmdlet 是我的答案。我 运行 通过 cmd 而不是 ps,但我认为它现在可以双向工作。 'EDIT: Works both ways.'
cmd
.\JavaSetup8u151.exe INSTALL_SILENT=1 AUTO_UPDATE=0 REBOOT=0 SPONSORS=0 REMOVEOUTOFDATEJRES=1
Start-Sleep -s 60
我建议使用:
Enter-PSSession -ComputerName $cn
计算安装所需的时间。 45秒有点害羞,所以我选择了完整的60秒。