web-dev-qa-db-ja.com

.NETのWindowsサービスから現在ログに記録されているユーザー名を取得するにはどうすればよいですか?

現在ログインしているユーザー名を必要とするWindowsサービスがあります。私は試した System.Environment.UserName、Windows ID、およびWindowsフォーム認証ですが、サービスがシステム特権で実行されているため、すべてがユーザーとして「System」を返しています。サービスアカウントの種類を変更せずに、現在ログインしているユーザー名を取得する方法はありますか?

58
Rajkishor Sahu

これは、ユーザー名を取得するための [〜#〜] wmi [〜#〜] クエリです。

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];

[参照]の下に手動でSystem.Managementを追加する必要があります。

78
Tapas

ユーザーのネットワークにいる場合、ユーザー名は異なります。

Environment.UserName

表示形式:「ユーザー名」ではなく

System.Security.Principal.WindowsIdentity.GetCurrent().Name

表示形式: 'NetworkName\Username'

必要な形式を選択します。

34

ManagementObjectSearcher( "SELECT UserName FROM Win32_ComputerSystem")ソリューションは、私にとってはうまくいきました。ただし、リモートデスクトップ接続を介してサービスを開始した場合は機能しません。これを回避するには、PCで常に実行されている対話型プロセスの所有者(Explorer.exe)のユーザー名を要求します。このようにして、Windowsサービスから現在Windowsにログインしているユーザー名を常に取得します。

foreach (System.Management.ManagementObject Process in Processes.Get())
{
    if (Process["ExecutablePath"] != null && 
        System.IO.Path.GetFileName(Process["ExecutablePath"].ToString()).ToLower() == "Explorer.exe" )
    {
        string[] OwnerInfo = new string[2];
        Process.InvokeMethod("GetOwner", (object[])OwnerInfo);

        Console.WriteLine(string.Format("Windows Logged-in Interactive UserName={0}", OwnerInfo[0]));

        break;
    }
}
19
xanblax

Tapas's answer の修正コード::

Dim searcher As New ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem")
Dim collection As ManagementObjectCollection = searcher.[Get]()
Dim username As String
For Each oReturn As ManagementObject In collection
    username = oReturn("UserName")
Next
6
Vishal Bedre

WindowsIdentity.GetCurrent()を試してください。 System.Security.Principalへの参照を追加する必要があります

誰かがユーザーを探している場合に備えてDisplay Nameユーザー名、私のような.

ここに御treat走があります:

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName。

プロジェクトのSystem.DirectoryServices.AccountManagementへの参照を追加します。

1
Bhramar

また試すことができます

System.Environment.GetEnvironmentVariable("UserName");
1
Adith

@xanblaxからの回答を完了する

private static string getUserName()
    {
        SelectQuery query = new SelectQuery(@"Select * from Win32_Process");
        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
        {
            foreach (System.Management.ManagementObject Process in searcher.Get())
            {
                if (Process["ExecutablePath"] != null &&
                    string.Equals(Path.GetFileName(Process["ExecutablePath"].ToString()), "Explorer.exe", StringComparison.OrdinalIgnoreCase))
                {
                    string[] OwnerInfo = new string[2];
                    Process.InvokeMethod("GetOwner", (object[])OwnerInfo);

                    return OwnerInfo[0];
                }
            }
        }
        return "";
    }
0
EAquino