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);
        }
    }