我正在使用PsExec远程启动程序。我可以从命令行远程启动实际程序(此处未显示)或cmd.exe,没有任何问题。当我尝试从ASP和C#触发它时,即使我使用的是完全相同的字符串,它也不会触发命令提示符。这是我正在使用的字符串,每次都有效,而无效的代码。请帮忙!
工作字符串:C:\psexec \\10.0.0.25 -u Administrator -p password -d -i cmd.exe
无效代码:
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();
答案 0 :(得分:1)
自从我是系统管理员以来已经有一段时间了,但是如果我没记错的话,必须从管理命令提示符下运行psexec。也许您的应用程序所运行的帐户没有权限通过网络访问并向远程计算机添加内容?
暂时将其放入您的Page_Load
:
Response.Write(Environment.UserName);
并再次运行它,它应该在应用顶部显示您要查找的名称。
答案 1 :(得分:1)
假设您对计算机有控制权,那么一个选项是将psexec命令设置为Task Scheduler作业,然后从ASP应用程序执行Task Scheduler作业。您可以将任务计划程序配置为以管理员身份运行,并且当您启动作业时,它将在该凭据下运行。但是您不会以这种方式获得任何输出,因此,如果这是一个问题,则可能不是一个好选择。
有关运行任务的示例,请参见How to run existing windows 7 task using command prompt。
答案 2 :(得分:0)
好吧,我现在正在做一些自动化工作,并且已经弄清了几件事。请查看下面的代码,也许它将对您有帮助
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);
}
}