現在ログインしているユーザー名を必要とするWindowsサービスがあります。私は試した System.Environment.UserName
、Windows ID、およびWindowsフォーム認証ですが、サービスがシステム特権で実行されているため、すべてがユーザーとして「System」を返しています。サービスアカウントの種類を変更せずに、現在ログインしているユーザー名を取得する方法はありますか?
これは、ユーザー名を取得するための [〜#〜] wmi [〜#〜] クエリです。
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];
[参照]の下に手動でSystem.Management
を追加する必要があります。
ユーザーのネットワークにいる場合、ユーザー名は異なります。
Environment.UserName
表示形式:「ユーザー名」ではなく
System.Security.Principal.WindowsIdentity.GetCurrent().Name
表示形式: 'NetworkName\Username'
必要な形式を選択します。
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;
}
}
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
WindowsIdentity.GetCurrent()
を試してください。 System.Security.Principal
への参照を追加する必要があります
誰かがユーザーを探している場合に備えてDisplay Nameユーザー名、私のような.
ここに御treat走があります:
System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName。
プロジェクトのSystem.DirectoryServices.AccountManagement
への参照を追加します。
また試すことができます
System.Environment.GetEnvironmentVariable("UserName");
@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 "";
}