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

Posted

技术标签:

【中文标题】PSEXEC 通过命令提示符成功运行,但在 ASP .Net/C# 中失败【英文标题】:PSEXEC runs successfully via command prompt but fails in ASP .Net/C# 【发布时间】:2016-03-15 14:26:57 【问题描述】:

我正在尝试使用 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();

【问题讨论】:

您是否尝试将 UseShellExecute 更改为 true? (这似乎是默认值) 【参考方案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();

我没有在测试,但我很确定这会奏效:)

【讨论】:

谢谢你,路易斯,你拯救了我的一天。【参考方案2】:

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

【讨论】:

以上是关于PSEXEC 通过命令提示符成功运行,但在 ASP .Net/C# 中失败的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PsExec 执行远程命令

Win7系统如何运行PsExec打开一个注册表项HKLM\SAM\SAM

通过批处理文件通过 psexec 窗口执行挂载命令

Psexec 远程执行文件 提示 拒绝访问

PSExec命令中1/0的含义是什么?

使用PSExec与本地管理员提示访问被拒绝