0

管理目的でWindowsServer2008のプロセスのリストを取得しようとしています。

私はこれに似たC#でいくつかのプログラムを書きました:

foreach ( Process clsProcess in Process.GetProcesses() )
{
    //do something
}

プログラムをタスクスケジューラから実行するようにスケジュールするまで、すべてが機能しています。どうやら、プログラムはそのように実行中のプロセスを見ることができません(空のリストを取得しました)。

タスクスケジューラでプログラムを実行しているときにプロセスのリストを取得するためのソリューションはありますか?

4

3 に答える 3

2

同じ問題が発生していますが、.NET 3.5および4と関係があります。System.Diagnostic.Processクラスは、WindowsServer2008コアまたはWindowsServer2008R2コアではサポートされていません。
プロセスクラス.NET

プラットフォームを見ると、残りの髪の毛を失う原因となったテキストが表示されます。私はまだこれを行う方法を探しており、解決策があれば投稿します。

System.ManagementObjectCollectionクラスはServer2008でもサポートされていないことがわかりました。これは、WMIクエリからコレクションを取得するための重要な部分です。

昨日遊んだ後、私はこの汚い解決策を思いつくことができましたが、それはうまくいきます。以下は、私が呼び出すvbscriptと、スクリプトを呼び出すメソッドです。

クエリプロセスへのVBScript

process = Wscript.Arguments.Item(0)
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set Processs = oWMI.ExecQuery("SELECT * FROM Win32_Process where Name='"& process &"'")
count = 0
ON ERROR RESUME NEXT
FOR EACH proc IN Processs
    count = count + 1
Next
IF Err.Number > 0 THEN
    count = -1
END IF
wscript.StdOut.Write count

スクリプトを呼び出すC#メソッド

 private bool IsProcessRunning()
    {
        int pcReturn = -1;
        bool blRunning = false;
        String strCmd = @"cscript";
        String arg = "//B //Nologo ProcessSearch.vbs YourProcess.exe";

        System.Diagnostics.ProcessStartInfo psi = new     System.Diagnostics.ProcessStartInfo(strCmd);
        psi.RedirectStandardOutput = true;
        psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        psi.UseShellExecute = false;
        psi.Arguments = arg;

        System.Diagnostics.Process procQuery;
        procQuery = System.Diagnostics.Process.Start(psi);
        String output = procQuery.StandardOutput.ReadToEnd();
        procQuery.WaitForExit();
        if (procQuery.HasExited)
        {
            bool isInt = Int32.TryParse(output, out pcReturn);
            if (!isInt)
            {
                pcReturn = -1;
            }
            else
            {
                if (pcReturn > 1)
                {
                    blRunning = true;
                }
            }
        }
        return blRunning;
    }
于 2011-04-13T14:38:52.627 に答える
1

アラン、私は確かに専門家ではありませんが、ユーザーの許可のように聞こえます。

どうやら、タスクスケジューラでタスクを設定するときに、タスクを実行するユーザーを選択し、続いてタスクが持つ権限のセットを選択できます。

おそらく、このリンクが役立つでしょう。

于 2011-03-31T09:43:26.017 に答える
0

その振る舞いの理由はわかりません。ただし、この場合、System.ManagementAPIが機能する可能性があります。これが例です。

于 2011-03-31T09:38:54.663 に答える