远程Powershell脚本无法安装.exe

远程Powershell脚本无法安装.exe,powershell,powershell-remoting,invoke-command,Powershell,Powershell Remoting,Invoke Command,编辑2:*经过大量测试和阅读,我意识到这是一个powershell限制“环境障碍”。()。我已通过将.exe作为任务运行解决了此问题** 编辑:经过大量测试后,问题似乎是由于远程PowerShell和本地PowerShell之间的差异造成的。。。问题还没有解决,所以欢迎任何帮助 我正在尝试做一些简单的事情,但这对我来说是行不通的 我有两台机器,机器A和机器B。正在运行的PowerShell v2和都是启用远程处理的相互信任的来源 我正试图通过以下命令通过MachineA在MachineB上运行脚

编辑2:*经过大量测试和阅读,我意识到这是一个powershell限制“环境障碍”。()。我已通过将.exe作为任务运行解决了此问题**

编辑:经过大量测试后,问题似乎是由于远程PowerShell和本地PowerShell之间的差异造成的。。。问题还没有解决,所以欢迎任何帮助

我正在尝试做一些简单的事情,但这对我来说是行不通的

我有两台机器,机器A和机器B。正在运行的PowerShell v2和都是启用远程处理的相互信任的来源

我正试图通过以下命令通过MachineA在MachineB上运行脚本:

invoke-command -computername MachineB { C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -executionpolicy Bypass Script.ps1 }
脚本本身尝试安装具有静默安装选项的.exe文件(基于其目录中的配置文件):

当我在MachineB上本地运行脚本时,所有工作正常,安装成功完成。然而,当我远程运行脚本(使用MachineA的第一个命令)时,它只是立即完成,什么也没有发生——安装程序根本不会在MachineB上的任务管理器中打开。不会产生错误,也不会记录日志

有趣的是,当我将实际脚本更改为“&C:\Windows\system32\cmd.exe/C Setup.exe-I silent”并远程运行它时,安装程序启动,在50%的cpu利用率下工作5-6秒,然后变为0%并永远挂起。再说一次,如果我在本地运行它,一切都会很完美

如果尝试:

  • 直接远程运行安装程序(例如,通过
    调用命令{&Setup.exe-i}
  • 编辑脚本以在不启动进程的情况下运行(例如
    &Setup.exe-i
  • 将脚本移动到MachineA并远程运行到MachineB(例如,
    invoke命令-filename sciprt.ps1-computername MachineB
如果我在MachineB上本地完成所有这些工作,但如果通过MachineA远程完成这些工作,则没有任何工作(尽管存在不同的问题)?我快疯了

我还通过以下方式检查remoteshell是否具有管理员权限:

([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
这是真的。另外,我可以远程编辑HKLM注册表,因此我认为它可以工作


在这一点上,任何想法都是非常受欢迎的

经过大量测试和阅读,我意识到这是powershell限制的“环境障碍”。()。我已经通过将.exe作为任务运行解决了这个问题,目前我一直在使用它。我在几百台机器上做了很多远程处理和安装软件。我们遇到了一个问题,每次重新启动时Java用户都会被删除。无论如何,可能需要2-5分钟才能从他们那里获得机器名,然后安装软件。我写了这篇小文章(仍在工作中,但仍在工作),所以我只需要他们的用户名,大约1.5分钟

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秒。

你的安装程序记录了什么吗?你能把它配置成日志吗?在启动进程时,我没有看到为
-FilePath
指定的完整路径。它只是为了问题的目的而混淆,还是与脚本位于同一目录中?让我想知道exe的路径是否是issueHI Matt,它在脚本中被混淆了。exe的路径正确(确切地说,路径是D:\Installers\IBM\EMM\u Installer.exe)。我似乎无法让它记录任何东西-exe似乎没有-help功能:/它接受的唯一参数是
-I silent
-I console
(用于手动控制台安装)…没有太多旁道,但Windows是否记录了发生这种情况的任何信息?相对于远程计算机,该路径是正确的?嗨,Matt,我在日志中找不到任何相关内容:-(您有什么特别的日志吗?我现在尝试了其他方法:
New PSSession-cn MachineB
,然后在远程会话中使用“&D:\Installers\IBM\EMM_Installer.exe”运行脚本……这样,进程开始,但几秒钟后再次挂起,cpu利用率为0%,内存使用率为0%……我从未发生任何事情。)t只是停留在那里。我也在杀死它后立即在MachineB上本地运行脚本,并正确安装所有东西。我认为这里可能有两个问题,但主要的问题是远程会话与本地会话不同,导致安装程序挂起?!我想这就是问题的根源。.
Enter-PSSession -ComputerName $cn