远程 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% 并永远挂起。同样,如果我在本地运行它,一切都会完美...

如果尝试过:

如果我在 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秒。