如果从用户生成的命令提示符运行,这是可以正常工作的命令:
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的限制吗?是的,用户名和密码具有管理权限。
答案 0 :(得分:11)
经过大量研究,它是一种Windows安全功能,可阻止对系统用户的所有网络访问,包括以另一个用户身份运行任务。我发现绕过这个问题的最好方法是创建一个从管理员帐户运行psexec的计划任务。
答案 1 :(得分:1)
Psexec强制通过添加 -s 参数来使用系统用户帐户。
我们使用psexec在远程计算机中启动某项任务,并在数据库表中登录。 当我们不使用-s参数时,user会显示为domain \ administrator但是如果你使用的话 -s参数显示为“System”
对于无效句柄消息,请检查:
https://superuser.com/questions/200938/psexec-the-handle-is-invalid
答案 2 :(得分:1)
您是否尝试过使用-h标志?
来自technet的:-h如果目标系统是Vista或更高版本,则使用帐户的提升令牌运行该流程(如果可用)。
整页:https://technet.microsoft.com/en-us/sysinternals/psexec.aspx
答案 3 :(得分:0)
它可能是无关的,但实际上我发现如果连接到机器,我得到了“手柄无效”错误 - 即机器已经睡着了。
答案 4 :(得分:0)
这是我用来遵循IT家伙关于安排任务以admin身份运行并避免出现“句柄无效”问题的说明的代码。
//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;
}
}
答案 5 :(得分: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");