14

如果从用户生成的命令提示符运行,这是可以正常工作的命令:

PSEXEC \\xxx.xxx.xxx.xxx -u xxxx -p xxxx -accepteula cmd /c "TYPE C:\Pyxislog\PYXIS01.log|Find/i "%ID%"" >nul

但是,如果我尝试从系统调用的 cmd 提示符运行它,我会得到:

Couldn't access 10.219.149.65:
The handle is invalid.
Connecting to 10.219.149.65...

它必须以系统用户身份运行,因为它将通过以系统用户身份运行的远程软件工具进行部署。这是 psexec 的限制吗?是的,用户名和密码具有管理权限。

4

6 回答 6

12

经过大量研究,它是一个windows安全功能,可以阻止系统用户的所有网络访问,包括以另一个用户身份运行任务。我发现规避此问题的最佳方法是创建计划任务以从管理员帐户运行 psexec。

于 2013-04-18T12:09:54.950 回答
2

Psexec 通过添加-s参数强制使用系统用户帐户。

我们使用 psexec 在远程计算机中启动一些任务,并将其记录在数据库表中。当我们不使用 -s 参数时,用户显示为域\管理员,但如果您使用 -s 参数,它显示为“系统”

对于无效的句柄消息,请检查:

https://superuser.com/questions/200938/psexec-the-handle-is-invalid

于 2012-12-01T20:01:10.827 回答
1

您是否尝试过使用 -h 标志?

来自 technet:-h 如果目标系统是 Vista 或更高版本,则使用帐户的提升令牌运行进程(如果可用)。

整页:https ://technet.microsoft.com/en-us/sysinternals/psexec.aspx

于 2015-12-29T06:07:49.597 回答
0

这可能是不相关的,但我实际上发现如果连接到机器上我得到了这个“句柄无效”错误 - 即机器睡着了。

于 2017-10-25T19:28:50.740 回答
0

这是我用来遵循 IT 人员关于安排任务以管理员身份运行并避免“句柄无效”问题的说明的代码。

        //Schedule a task that will run the script
        using (TaskService ts = new TaskService())
        {
            TaskDefinition td = ts.NewTask();
            td.RegistrationInfo.Description = "Runs script as admin user";
            td.Triggers.Add(new TimeTrigger(DateTime.Now.AddMinutes(2)));
            td.Actions.Add(new ExecAction(@"C:\...\script.exe"));
            try
            {
                ts.RootFolder.RegisterTaskDefinition(@"Script", td, TaskCreation.CreateOrUpdate, "username", "password", logonType: TaskLogonType.Password);
            }
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine("Could not register task in task scheduler.");
                Console.WriteLine(e.ToString());
                return;
            }
        }
于 2019-07-09T18:56:30.587 回答
0

我的代码完美运行:

public static void RunTask(string[] task, string username, string password)
{
    System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(task[1] + ".exe");
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.CreateNoWindow = true;
    psi.UseShellExecute = false;
    string args = String.Format(@"-u {1} -p {2} -accepteula \\{0} " + (task[1] == "psexec" ? "-d -s -i 2 {3}" : "{3}"), task[0], username, password, task[1] == "psservice" ? task[2].TrimStart('"').Insert(task[2].IndexOf(' '), "\"") : task[2]);
    psi.Arguments = args;

    System.Diagnostics.Process prc = System.Diagnostics.Process.Start(psi);
    string output = (prc.StandardError.ReadToEnd() + "\r\n" + prc.StandardOutput.ReadToEnd()).Trim();
    output = output.Substring(output.IndexOf(".com\r\n\r\n") + 8);

    prc.WaitForExit();

    if (!(output.Contains("started on") || output.Contains("killed on") || output.Contains("SERVICE_NAME"))) throw new Exception(output);
}

示例调用:

    RunTask(new string[] { "MACHINE", "psexec", @"""C:\Program Files (x86)\Internet Explorer\iexplore.exe""" }, "USERNAME", "PASSWORD");
    RunTask(new string[] { "MACHINE", "pskill", @"""iexplore.exe""" }, "USERNAME", "PASSWORD");
    RunTask(new string[] { "MACHINE", "psservice", @"""start SOMESERVICE""" }, "USERNAME", "PASSWORD");
    RunTask(new string[] { "MACHINE", "psservice", @"""stop SOMESERVICE""" }, "USERNAME", "PASSWORD");
  • 确保程序旁边有psexec.exepskill.exepsservice.exe
于 2019-10-30T09:22:08.877 回答