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()メソッドがあります。一方のプロジェクトは、もう一方のプロジェクトを呼び出すタイマーを使用してバックグラウンドで実行され、そのプロジェクトはユーザーがカスタマイズしたフォームを生成します。
管理者アカウントを除くすべてのユーザーアカウントでフォームが表示されない理由について、別の関連する質問があります。この質問を見つけたら、別の質問として投稿します。