我正在使用 PsExec 远程启动程序。我可以从命令行远程启动实际的程序(此处未显示)或 cmd.exe,没有任何问题。当我尝试从 ASP 和 C# 触发它时,它不会触发命令提示符,即使我使用的是相同的字符串。这是我每次使用的字符串,以及每次都不起作用的代码。请帮忙!
工作弦:
C:\psexec \\10.0.0.25 -u Administrator -p password -d -i cmd.exe
非工作代码:
Process process = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"C:\PsExec.exe")
{
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true,
Arguments = @"\\10.0.0.25 -u Administrator -p password -d -i cmd.exe"
};
process.StartInfo = psi;
var success = process.Start();
假设您可以控制计算机,一种选择是将 psexec 命令设置为任务计划程序作业,然后从 ASP 应用程序执行任务计划程序作业。您可以将任务计划程序配置为以管理员身份运行,当您启动作业时,它将在该凭据下运行。不过,您不会以这种方式获得任何输出,因此,如果这是一个问题,则可能不是一个好的选择。
有关运行任务的示例,请参阅如何使用命令提示符运行现有的 Windows 7 任务..
我担任系统管理员已经有一段时间了,但如果我没记错的话, psexec 必须从管理命令提示符运行。也许您的应用程序运行所用的帐户没有权限通过网络访问并对远程计算机执行操作?
暂时将其放入您的
Page_Load
中:
Response.Write(Environment.UserName);
然后再次运行它,它应该会在应用程序顶部显示您要查找的名称。
嗯,我现在正在做一些自动化工作,并且已经弄清楚了一些事情。请参阅下面的代码也许会对您有所帮助
public static void PSExec_Method()
{
try
{
string userName = @"ABC";
string password = "ABC";
string remoteMachine = "ABC";
//How to restart AppPool
//string operation = "stop";
//string apppoolname = "APPPOOL";
//string command = @"%SYSTEMROOT%\System32\inetsrv\appcmd " + operation + " apppool /apppool.name:\"" + apppoolname + "\"";
string command = @"powershell -noninteractive Get-Content C:\tmp\tmp.csv -Head 5";
//string command = @"ipconfig";
string PSPath = @"C:\PSTools\PsExec.exe";
string fullcommand = PSPath + " -u " + userName + " -p " + password + " \\\\" + remoteMachine + " -h cmd.exe /c " + command;
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = fullcommand;
process.Start();
Console.WriteLine(process.StandardOutput.ReadToEnd());
Console.WriteLine(process.StandardError.ReadToEnd());
process.WaitForExit();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}