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

PSEXEC runs successfully via command prompt but fails in ASP .Net/C#

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

PsExec v2.11 - Execute processes remotely Copyright (C) 2001-2014 Mark Russinovich Sysinternals - www.sysinternals.com

The handle is invalid.

Connecting to lnxdevx...

Starting PSEXESVC service on lnxdevx...

Connecting with PsExec service on lnxdevx...

Error deriving session key:.

这是我的示例 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();

问题是您不必打开 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();

我没有在测试,但我很确定这会起作用:)

虽然接受的答案是解决问题,但还有更好的解决方案(至少不涉及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