远程Powershell脚本无法安装.exe

时间:2015-01-07 20:16:19

标签: powershell powershell-remoting invoke-command

EDIT2:**经过多次测试和阅读后,我意识到这是一个强大的限制和环境障碍。" (read more here)。我通过schtasks.exe **

将.exe作为一项任务解决了这个问题 编辑:经过大量测试后,问题似乎是由远程PowerShell和本地PowerShell之间的差异引起的......问题仍然没有解决,所以任何帮助都不过是受欢迎的!

我试图做一些相当简单的事情,这对我不起作用。

我有两台机器,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"并远程运行安装程序启动,在50%的CPU利用率下工作5-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")

它返回True。另外,我可以远程编辑HKLM注册表,因此我认为它正常工作。

此时任何想法都受到欢迎!

2 个答案:

答案 0 :(得分:0)

经过大量的测试和阅读后,我意识到这是一个强大的限制“环境障碍”。 (read more here)。我通过schtasks.exe

运行.exe作为任务解决了这个问题

答案 1 :(得分:0)

我目前一直在玩这个。我为几百台机器做了很多远程操作和安装软件。我们遇到了一个问题,即用户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没有运行;我认为它是在安装完成之前尝试在最后运行IF ELSE检查。 Start-Sleep cmdlet是我的答案。我通过cmd而不是ps运行它,但我认为它现在可以双向工作。 '编辑:两种方式都有效。'

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。