0

ac#WinFormソリューションを編集していますが、ユーザーアカウント名を取得するコードがわかりません。コードを以下に示します。

アプリケーションはユーザーアカウントごとにカスタマイズされたフォームを表示し、SQLデータベースからユーザー固有の構成値を取得するにはユーザーアカウント名が必要です。

何が起こるかというと、私が知る限り、返されたユーザー名は最初にアクセスしたユーザーアカウントに対して正しいのですが、別のユーザーアカウントに切り替えた後、返されたユーザーアカウント名は更新されず、最初のユーザーアカウント名は引き続き更新されます。戻ってきた。

#region "Function to retrieve LoggedIn user"
/// <summary>
/// "Function to retrieve LoggedIn user"
/// </summary>
/// <returns></returns>
private string GetLoggedInUserName()
{
    ManagementClass objManClass = new ManagementClass("Win32_Process");
    ManagementObjectCollection arrManObjects = objManClass.GetInstances();
    foreach (ManagementObject objMan in arrManObjects)
    {
        if (objMan["Name"].ToString().Trim().ToLower() == "explorer.exe")
        {
            string[] arrArgs = { "", "" };
            try
            {
                objMan.InvokeMethod("GetOwner", arrArgs);
                sUserName = arrArgs[0];
                break;
            }
            catch (Exception lExp)
            {
                BusinessObject.Logger.Logger.Log(lExp);
            }
        }
    }
    return sUserName;
}
#endregion

このアプリケーションは、XP、Vista、および7で実行されます。

私の本能はただのようなものを使うことです...

string sUserName = Environment.UserName;

...しかし、Windows OSに関する私の知識は乏しく、元のコードを書いた人は私よりはるかに賢いです。

したがって、私の2つの質問は次のとおりです。(1)ユーザーアカウントを変更したときに、このコードが新しいユーザー名に更新されないように見えるのはなぜですか?(2)単に「Environment.UserName」を使用する代わりに「explore.exe」メソッドを使用するのはなぜですか?

また、私のソリューションの2つのプロジェクトには、GetLoggedInUserName()メソッドがあります。一方のプロジェクトは、もう一方のプロジェクトを呼び出すタイマーを使用してバックグラウンドで実行され、そのプロジェクトはユーザーがカスタマイズしたフォームを生成します。

管理者アカウントを除くすべてのユーザーアカウントでフォームが表示されない理由について、別の関連する質問があります。この質問を見つけたら、別の質問として投稿します。

4

3 に答える 3

4

現在ログインしているユーザーが必要な場合は、useはWindowsIdentityオブジェクトを使用できます。

string currentUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
于 2010-09-23T13:15:23.197 に答える
1

ユーザー名ビットについては、...を試してください。

文字列username=System.Security.Principal.WindowsIdentity.GetCurrent()。Name;

于 2010-09-23T13:16:43.847 に答える
1

Windowsボックスにログオンすると、Explorerプロセスは常に実行されているため、常に検出されます。タスクマネージャーを開いてプロセスを表示すると、タスクマネージャーとそれを開始したアカウントが表示されます。VBScriptに戻るように見えますが、それを使用する方が簡単な方法があると確信しています。

WMIを使用して、他のより単純な方法よりもローカルマシンの現在のユーザーアカウントを取得する理由はありません。

于 2010-09-23T13:22:05.410 に答える