Visual Studio 2008が管理者として実行されているときにタイトルバーに「管理者」を表示するのと同様に、プロセスが管理者として実行されていないときではなく、管理者として実行されているときにいくつかの追加のUI要素を表示したいと思います。どうすればわかりますか?
5 に答える
技術的には、メンバーがローカルの管理者アカウントであるかどうかを確認したい場合は、次のようにクラスのプロパティを介して現在のユーザーのセキュリティ識別子 (SID)を取得できます(静的メソッドは現在の Windows ユーザーを取得します)。User
WindowsIdentity
GetCurrent
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
string sid = windowsIdentity.User.ToString();
このプロパティは、さまざまなグループおよびユーザーに対して多数の定義済みの値を持つUser
ユーザーの SID を返します。
次に、SID に次のパターンがあるかどうかを確認します。これは、それがローカル管理者アカウント (既知の SID) であることを示しています。
S-1-5- {その他の SID 部分} -500
または、文字列を解析したくない場合は、次のSecurityIdentifier
クラスを使用できます。
// Get the built-in administrator account.
var sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid,
null);
// Compare to the current user.
bool isBuiltInAdmin = (windowsIdentity.User == sid);
しかし、あなたが本当に知りたいのは、現在のユーザーがローカル マシンの管理者グループのメンバーであるかどうかだと思います。WellKnownSidType
ofを使用して、この SID を取得できますBuiltinAdministratorsSid
。
// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
WellKnownSidType.BuiltinAdministratorsSid, null);
次に、ユーザーのGroups
プロパティをチェックしてWindowsIdentity
、そのユーザーがローカル管理者グループのメンバーであるかどうかを確認できます。次のようにします。
bool isLocalAdmin = windowsIdentity.Groups.
Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
Any(s => s == localAdminGroupSid);
これを行うためのワンライナーを次に示します。
using System.Security.Principal;
static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
上記の casperOne の回答に従って、 WellKnownSidType.BuiltinAdministratorsSid を使用しようとする際の難しさに注意することが重要だと感じました。WellKnownSiDType MSDNによると、 BuiltinAdministratorsSidは「管理者アカウントに一致する SID を示します」。したがって、casperOne のコードが機能することを期待し、一部の環境では機能する可能性が高いと推測します。残念ながら、.NET 2.0 (レガシー コード) を使用する Windows 2003 では動作しませんでした。実際に返された S-1-5-32-544は、この記事によると Administratorsグループの sid です。したがって、比較は失敗します。「S-1-5-21」で始まる文字列を独自に比較する必要があります (kb 243330 は「21」を示します)。