0

私のプログラムは、Local System Account(実際のユーザーがログインしている)の下で実行されるサービスから開始されます。プログラムのタスクの1つは、ネットワークパスにファイルを保存することです。これには、現在のユーザー名が含まれている必要があります\\server\\storage\\%username%。ただし、問題は、環境変数を読み取るときに、ユーザーアカウントではなくシステムアカウントの名前を取得することです。

Environment.GetEnvironmentVariable("username");

この場合、正しいユーザー名を取得する方法はありますか?

4

2 に答える 2

1

私の解決策は、どのユーザーがエクスプローラープロセスを開始したかを見つけることでした。

System.Management.NETライブラリを参照する場合にのみ機能します

private static string GetExplorerUser()
{
    var process = Process.GetProcessesByName("explorer");
    return process.Length > 0
        ? GetUsernameByPid(process[0].Id)
        : "Unknown-User";
}

private static string GetUsernameByPid(int pid)
{
    var query = new ObjectQuery("SELECT * from Win32_Process "
        + " WHERE ProcessID = '" + pid + "'");

    var searcher = new ManagementObjectSearcher(query);
    if (searcher.Get().Count == 0)
        return "Unknown-User";

    foreach (ManagementObject obj in searcher.Get())
    {
        var owner = new String[2];
        obj.InvokeMethod("GetOwner", owner);
        return owner[0] ?? "Unknown-User";
    }

    return "Unknown-User";
}

もう1つの可能性は、qwinstaコマンドの出力を解析することです。

于 2011-04-05T14:23:34.223 に答える
0

プログラムを別のユーザーとして起動するための対策を講じていない場合(CreateProcessAsUser et al。)、プログラムは呼び出し元のプログラムと同じユーザーとして実行されます。

于 2011-04-05T11:56:31.340 に答える