2011-04-19 164 views
2

我需要在远程计算机上运行PS脚本,正如下面的代码所做的那样。使用PSTool在远程计算机上运行PowerShell脚本

Process psExecer = new Process 
      { 
       StartInfo = 
       { 
        UseShellExecute = false, 
        CreateNoWindow = false, 
        WindowStyle = ProcessWindowStyle.Hidden, 
        FileName = @"c:\PsTools\PsExec.exe", 
        Arguments = @"c:\windows\System32\cmd.exe /k c:\windows\System32\WindowsPowerShell\v1.0\powershell.exe E:\Scripts\SetUP.ps1 -u super -p Pass -s"   
       } 
      }; 

      psExecer.Start(); 
      psExecer.WaitForExit(); 
      Thread.Sleep(5000); 

问题是脚本有一些共享点cmdlet,它必须加载共享点PSSnapin。仅当脚本在Powershell的64位映像中运行时脚本才能正常运行。

当我尝试使用PSTool运行时,即使当我明确提到代码中显示的路径时,PSTool始终会从%windir%\ SysWoW64文件夹中调用32位PowerShell。

为什么会这样,该如何解决我的问题

问候, 哎呀

+0

只是好奇,但为什么你加载'cmd'然后得到它加载'powershell',而不是直接运行'powershell'? – 2011-04-19 10:35:43

+0

试过直接加载powershell给出了同样的错误,所以尝试使用cmd加载这并没有多大用处 – JeeZ 2011-04-19 10:43:50

+0

我假设它是一个错字,但是你声明你需要运行64位版本的powershell,但是然后从' System32'。你可以更新你的问题,以确保没有混淆......? – 2011-04-19 10:50:09

回答

2

当32位应用程序引用C:\ System32下它重定向到SYSWOW64

尝试\ WINDOWS使用c:\​​ windows \ sysnative \ windowspowershell \ v1.0 \ powershell.exe

+0

Jako你是对的,我正面临这个问题,因为PsTool是一个32位应用程序,因此总是调用32位PowerShell。感谢信息。 – JeeZ 2011-04-20 04:39:48

1

您调用的问题是由于UAC导致的进程虚拟化的副作用。

这里有三种解决方法:

1.在目标计算机上删除UAC

2. WinRM的

如果你想在目标上远程执行PowerShell脚本,如Windows 2008 R2和Windows 7,最好的方法是使用WSMan,只需看看about_Remote帮助在PowerShell中。

3.尝试在你的远程计算机

上调用为了防止虚拟化,在同一目录中您要删除虚拟化的EXE文件中添加清单过程中删除虚拟化。清单是名为yourexename.exe.manifest的XML文件。 You can find in this site a manifest sample。尝试将requestedPrivileges设置为asInvoker

相关问题