特定のユーザーのプロセスがリモートマシン上で実行されているかどうかを確認する

特定のプロセスがリモートマシン上の特定のユーザー(サービスアカウント)に対して実行されているかどうかをチェックする実行可能ファイルを作成する必要があります。入力パラメータは3文字列、マシン名、ユーザー名、およびプロセス名です。

私は、 System.Diagnostics または WMI のいずれかを使用してこれを行うアイデアを持っています。誰かがpowershellのような別のアイデアを持っているか、タスクはさらに簡単です。

プロセスが常に専用のサーバーで実行されていることを確認したいので、このチェックを行う小さなコンソールアプリケーションを実行するようにスケジュールされたタスクを構成します。 C#でコーディングするのが最善の選択肢なのか、Windowsサーバーの組み込み機能を無視しているのかわからないのですか?ありがとう!

2

3 答え

I'm pretty sure you can accomplish this with tasklist cmd: tasklist /S \\ /V > tasklist.txt. this will give you a file you can grep through.

1
追加された
/ I/F "IMAGENAME eq [プロセス名]" を試してください。 tasklist/S \\ [machine name]/V/FI "USERNAME eq [user name]
追加された 著者 Davin Tryon,
私は他のオプションのいくつかをもう少し試してみました。そこにいくつかの良いものがあります!より洗練された結果を得るには、/V を外して/NH (No Header)を置いてください。また、/SVC を追加すると、他の列の一部を削除するのに役立ちました(ただし、それが何を指定しているかはわかりません)。
追加された 著者 Davin Tryon,
ありがとう、これは良いですが、私はまだ結果ファイルを解析する必要があり、私はそれのための.NETコードが必要になります。
追加された 著者 Davide Piras,
そんなに大変ありがとうございます!
追加された 著者 Davide Piras,

参照されていない名前空間 System.Managementを使用します。

私はC#で次のソリューションを実装することで終わった

this retrieves the username without domain name of the user running processName on machineName

public static string GetProcessOwner()
{
    try
    {
        var resultUserName = string.Empty;

        ConnectionOptions opt = new ConnectionOptions();

        string path = string.Format(@"\\{0}\root\cimv2", machineName);

        ManagementScope scope = new ManagementScope(path, opt);

        scope.Connect();

        var query = new ObjectQuery(string.Format("Select * From Win32_Process Where Name = '{0}'", processName));
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

        var processList = searcher.Get();

        foreach (ManagementObject obj in processList)
        {
            string[] argList = new string[] { string.Empty, string.Empty };
            int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList));

            if (returnVal == 0)
            {
               //return DOMAIN\user 
                //return argList[1] + "\\" + argList[0];
                resultUserName = argList[0];
            }
        }

        return resultUserName; 
    }
    catch (Exception exc)
    {
        Debug.WriteLine(exc.Message);

        return string.Empty;
    }
}
1
追加された

GetOwnerは、リモートコンプに空の配列を返すことができるので、動作しない可能性があります

0
追加された