問題があります...右クリックでプログラムを開始します->管理者として実行します。これは、プログラムが管理コンテキストで実行されていることを意味します。
WindowsIdentity.GetCurrent().Name;
その方法でユーザー名を取得しようとすると、プログラムを開始したユーザーを管理者として取得します。たとえば、「管理者」ですが、必要なのは現在ログインしているユーザーの名前です。たとえば、ボブです。
誰でも私を助けることができますか?:)
問題があります...右クリックでプログラムを開始します->管理者として実行します。これは、プログラムが管理コンテキストで実行されていることを意味します。
WindowsIdentity.GetCurrent().Name;
その方法でユーザー名を取得しようとすると、プログラムを開始したユーザーを管理者として取得します。たとえば、「管理者」ですが、必要なのは現在ログインしているユーザーの名前です。たとえば、ボブです。
誰でも私を助けることができますか?:)
WMI (System.Management.dll) を使用して、explorer.exe
プロセスの所有者を取得してみてください。
string GetExplorerUser()
{
var query = new ObjectQuery(
"SELECT * FROM Win32_Process WHERE Name = 'explorer.exe'");
var explorerProcesses = new ManagementObjectSearcher(query).Get();
foreach (ManagementObject mo in explorerProcesses)
{
string[] ownerInfo = new string[2];
mo.InvokeMethod("GetOwner", (object[])ownerInfo);
return String.Concat(ownerInfo[1], @"\", ownerInfo[0]);
}
return string.Empty;
}
これは、エクスプローラー プロセスが単一インスタンスであり、複数のエクスプローラー プロセスが異なるユーザー資格情報で実行される可能性がないという事実に依存しています。
1)Cassiaは、RDCを含む現在ログインしているユーザーのリストを提供できるはずです。
foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions())
{
// sess.SessionId
// sess.UserName
}
2)WMI(SO回答)
Select * from Win32_LogonSession
3)WTSEnumerateSessionsへのPInvoke
4)「explorer.exe」のすべてのインスタンスを列挙し、PInvoke(OpenProcessHandle)を使用して所有者を取得します。
Process[] processes = Process.GetProcessesByName("explorer");
これは少しハッキーです。これには、 WMIも使用できます。
WMIを使用するソリューションを使用する場合は、サービスの依存関係としてwinmgmtを設定することをお勧めします。
そのためには、おそらく win32 API を使用する必要があります。Window Station とデスクトップの機能については、http: //msdn.microsoft.com/en-us/library/ms687107%28v=vs.85%29.aspxを参照してください。
この質問も参照してください: デスクトップに関連付けられたログイン中の Windows ユーザー名を取得する
おそらく、通常のユーザーとして開始し、ユーザー名を保存してから、プログラムで昇格を要求できます。
すべての .NET ライブラリは、現在のコンテキスト (この場合は「管理者」) からユーザーを提供します。
コードを保護しようとしている場合は、以下を読むことを検討してください: .NET フレームワークのセキュリティ