web-dev-qa-db-ja.com

PSEXEC-システムユーザーとしてコマンドを実行すると、「ハンドルが無効です」

これは、ユーザーが作成したコマンドプロンプトから実行した場合に正常に機能するコマンドです。

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

ただし、これをシステム起動のコマンドプロンプトから実行しようとすると、次のようになります。

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

システムユーザーとして実行されるリモートソフトウェアツールを介して展開されるため、システムユーザーとして実行する必要があります。これはpsexecの制限ですか?はい、ユーザー名とパスワードには管理者権限があります。

13
bill

多くの調査の後、別のユーザーとしてのタスクの実行を含む、システムユーザーへのすべてのネットワークアクセスをブロックするのは、Windowsのセキュリティ機能です。これを回避するために私が見つけた最良の方法は、管理者アカウントからpsexecを実行するスケジュールされたタスクを作成することです。

11
bill

-hフラグを使用してみましたか?

technetから:-hターゲットシステムがVista以上の場合、アカウントの昇格されたトークンを使用してプロセスを実行します(可能な場合)。

全ページ: https://technet.Microsoft.com/en-us/sysinternals/psexec.aspx

1
The IT guy

Psexecは、-sパラメータを追加することにより、システムユーザーアカウントを強制的に使用します。

Psexecを使用してリモートコンピューターでいくつかのタスクを起動し、データベーステーブルにログを記録します。 -sパラメータを使用しない場合、userはdomain\administratorとして表示されますが、-sパラメータを使用する場合は「System」として表示されます

無効なハンドルメッセージについては、次を確認してください。

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

1
Carlos Landeras

これは、管理者として実行し、「ハンドルが無効です」の問題を回避するようにタスクをスケジュールする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;
            }
        }
0
Shannon M

私のコードは完全に動作します:

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.exeおよびpsservice.exeがあることを確認してください。
0
Bilal Halayqa

それは無関係である可能性がありますが、接続がマシンに到達した場合、つまりマシンがスリープ状態になった場合、実際には「ハンドルが無効です」というエラーが発生しました。

0
vapcguy