web-dev-qa-db-ja.com

プロセスが管理者として実行されているかどうかを確認するにはどうすればよいですか?

Visual Studio 2008が管理者として実行されているときにタイトルバーに「管理者」を表示するのと同様に、プロセスが管理者として実行されていないときではなく、管理者として実行されているときにいくつかの追加のUI要素を表示したいと思います。どうすればわかりますか?

32
Erik Forbes

技術的には、メンバーがローカル管理者アカウントであるかどうかを確認する場合は、現在のユーザーの セキュリティ識別子(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);
34
casperOne

これは良い単純なメカニズムだと思います。

using System.Security.Principal;

WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
19
Kenn

これがそれを行うためのワンライナーです。

using System.Security.Principal;

static bool IsElevated => new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
3
Bryan Legend

上記の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」で終わるために、独自の文字列比較を行う必要があります。

0
tbradt