Psexec 适用于命令行,但不适用于 ASP
Psexec works on command line but not in ASP
我正在使用 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();
我成为系统管理员已经有一段时间了,但如果我没记错的话,psexec 必须是 运行 来自管理命令提示符。也许您的应用 运行ning 所在的帐户无权访问网络并对远程计算机执行操作?
暂时将此放入您的Page_Load
:
Response.Write(Environment.UserName);
和 运行 再次显示它,它应该会在应用顶部显示您要查找的名称。
假设您可以控制机器,一个选项是将 psexec 命令设置为任务计划程序作业,然后从您的 ASP 应用程序执行任务计划程序作业。您可以以管理员身份将任务计划程序配置为 运行,当您启动作业时,它将在该凭据下 运行。不过,您不会以这种方式获得任何输出,因此如果这是一个问题,则可能不是一个好的选择。
有关 运行 任务的示例,请参阅 How to run existing windows 7 task using command prompt..
好吧,我现在正在做一些自动化,并且已经弄清楚了一些事情。请看下面的代码,也许它会对你有所帮助
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);
}
}
我正在使用 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();
我成为系统管理员已经有一段时间了,但如果我没记错的话,psexec 必须是 运行 来自管理命令提示符。也许您的应用 运行ning 所在的帐户无权访问网络并对远程计算机执行操作?
暂时将此放入您的Page_Load
:
Response.Write(Environment.UserName);
和 运行 再次显示它,它应该会在应用顶部显示您要查找的名称。
假设您可以控制机器,一个选项是将 psexec 命令设置为任务计划程序作业,然后从您的 ASP 应用程序执行任务计划程序作业。您可以以管理员身份将任务计划程序配置为 运行,当您启动作业时,它将在该凭据下 运行。不过,您不会以这种方式获得任何输出,因此如果这是一个问题,则可能不是一个好的选择。
有关 运行 任务的示例,请参阅 How to run existing windows 7 task using command prompt..
好吧,我现在正在做一些自动化,并且已经弄清楚了一些事情。请看下面的代码,也许它会对你有所帮助
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);
}
}