Visual Studio 2008が管理者として実行されているときにタイトルバーに「管理者」を表示するのと同様に、プロセスが管理者として実行されていないときではなく、管理者として実行されているときにいくつかの追加のUI要素を表示したいと思います。どうすればわかりますか?
技術的には、メンバーがローカル管理者アカウントであるかどうかを確認する場合は、現在のユーザーの セキュリティ識別子(SID) を取得できます。 User
property on WindowsIdentity
class 、like so(static GetCurrent
method =現在のWindowsユーザーを取得します):
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);
ただし、本当に知りたいのは、現在のユーザーがローカルの管理者グループのメンバーであるかどうかだと思います。機械。このSIDは、WellKnownSidType
の- BuiltinAdministratorsSid
を使用して取得できます。
// Get the SID of the admin group on the local machine.
var localAdminGroupSid = new SecurityIdentifier(
WellKnownSidType.BuiltinAdministratorsSid, null);
次に、ユーザーのGroups
の- WindowsIdentity
property をチェックして、そのユーザーがローカル管理者グループのメンバーであるかどうかを確認できます。
bool isLocalAdmin = windowsIdentity.Groups.
Select(g => (SecurityIdentifier) g.Translate(typeof(SecurityIdentifier))).
Any(s => s == localAdminGroupSid);
これは良い単純なメカニズムだと思います。
using System.Security.Principal;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
これがそれを行うためのワンライナーです。
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(レガシーコード)を搭載したWindows2003では動作しませんでした。実際にはS-1-5-32-544が返されました。これは、 この記事 によると、管理者groupのsidです。 。したがって、比較は私にとって失敗します。 「S-1-5-21」で始まり(上記のブログには含まれていなくても、kb 243330は「21」が含まれていることを示します)、「500」で終わるために、独自の文字列比較を行う必要があります。