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 }
)& Setup.exe -i
)invoke-command -filename sciprt.ps1 -computername MachineB
)如果我在MachineB上本地执行所有这些工作,但是如果通过MachineA远程完成(但有不同的问题)则无法工作吗?我疯了。
我还检查了remoteshell是否具有管理员权限:
([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
它返回True。另外,我可以远程编辑HKLM注册表,因此我认为它正常工作。
此时任何想法都受到欢迎!
答案 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。