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# 中失败的主要内容,如果未能解决你的问题,请参考以下文章