PSEXEC通过命令提示符成功运行但在ASP .Net / C#中失败

时间:2016-03-15 14:26:57

标签: c# asp.net psexec

我尝试使用PSEXEC工具在远程计算机上运行命令,它使用命令提示符成功运行但在asp.net项目中失败,显示以下输出错误。

  

PsExec v2.11 - 远程执行进程版权所有(C)2001-2014 Mark   Russinovich Sysinternals - www.sysinternals.com

     

句柄无效。

     
    

连接到lnxdevx ...

         

在lnxdevx上启动PSEXESVC服务......

         

在lnxdevx上与PsExec服务连接...

         

导出会话密钥时出错:。

  

这是我的示例c#代码。

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.FileName = @"C:\Windows\System32\PsExec.exe";
p.StartInfo.Arguments = "-u xxxxxx -p xxxxxxxxxx \\\\lnxdevx -i -d -w \"C:\\DIRECTORY\" cmd.exe /C dir";
p.Start();
string output = p.StandardOutput.ReadToEnd();
string errormessage = p.StandardError.ReadToEnd();
p.WaitForExit();

2 个答案:

答案 0 :(得分:1)

问题是您不必打开psexec,而是cmd,然后从那里开始运行psexec。

您尝试执行的代码也是错误的,您需要使用

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe"; \\if it is in System32
startInfo.Arguments = "psexec -u xxxxxx -p xxxxxxxxxx \\machine *your stuff*";
process.StartInfo = startInfo;
process.Start();

我没有测试,但我确信这会起作用:)

答案 1 :(得分:0)

虽然接受的答案是解决问题,但有更好的解决方案(至少不涉及 cmd)。

转到应用程序池 -> Advanced Settings -> 部分 "Process Model" -> "Load User Profile"

默认值为 false。当您将其更改为 true 时,一切正常。

更多的东西(更多的解释,需要进一步的研究)。

  • psexec 和 SysInternals 的所有工具都需要接受 EULA。这可以通过使用 -accepteula 调用它们来解决,参见 psexec at ss64
  • 这应该保存在注册表中。您必须有个人资料才能阅读。

基于https://nigglingaspirations.blogspot.com/2015/04/psexec-error-deriving-session-key.html