2016-04-22 16 views
1

アプリケーションが管理者ユーザーで実行されているかどうかを知るコードがあります。トークンがAdminグループのメンバに属していることを確認してください

今、私はプロセスのトークンを取得し、プロセスの所有者のSIDを抽出できます。うまくいく。だから私はこの "SecurityIdentifier"オブジェクトを持っていますが、実際に管理グループのメンバーであるかどうかをチェックする方法はわかりません。

だから誰かが道を知っていれば、それは素晴らしいだろう。

しかし、今、私はプロセスから取得したトークンからWindowsIdentityオブジェクトを作成する方法を見つけましたが、現在のところ偽装しているようです。しかし、WindowsPrincipal.IsInRoleメソッドを呼び出した後、Win32から大きな「アクセス拒否」エラーが発生します。だから私は実際には他の行き止まりにぶつかった。

答えがWinAPIまたは.NetFrameworkに依存する場合は、重要ではありません。

おかげ

+0

あなたが必要なものを見つけるまで、あなたは、例えば、System.DirectoryServicesを使用して、すべてのユーザーを経ることがあり、その後、彼女のグループは –

+0

あなたが得るどのように教えていただけますチェックWin32経由のSID?これが.Netで実行できる場合は、IsInRole –

+0

@AlexKを呼び出すことができます。詳細情報が追加されました。 –

答えて

1

まあ、WindowsIdentityWindowsPrincipalクラスのソースコードをチェックした後、私は「を拒否されましたアクセス」を取得するための理由は、私が最初の場所でのトークンを取得した方法だったということ。ました 最初から始めましょう:

WindowsIdentityは、プロセス/スレッドトークンを表すクラスです。したがって、トークンを初期化する方法はトークンを提供することです。私の場合は、OpenProcessToken関数を使って別のプロセスからトークンを取得しました。

これは、トークンデータのクエリと情報の取得に最適です。私の場合のように私はしました。しかし、WindowsPrincipalクラスの隣で使用すると、十分ではありません。

WindowsPrincipal.IsInRoleCheckTokenMembershipExを使用して、トークンがユーザーグループに属しているかどうかを確認します。しかし、CheckTokenMembershipEx関数を使用できるようにするには、プロセス/スレッドトークンを偽装する必要があります。 WindowsPrincipal.IsInRoleはこれを完全に認識しており、提供されたWindowsIdentityNoneという偽装レベルがある場合、DuplicateTokenExを使用して偽装トークンを作成します。

残念ながら、tho、私は間違いを犯しました。トークンを取得するためにプロセスを開くとき、私はこの動作を期待していませんでした。実際、私はWindowsPrincipal.IsInRoleがフードの下でCheckTokenMembershipEx機能を使用していることを知らなかった。だから私はプロセストークンを開くときにDuplicateのアクセス権を要求しなかった。これにより、DuplicateTokenExが失敗し、 "アクセスが拒否されました"というメッセージが表示されます。右を加え、すべてを解決しました。ここで

は、興味のある人のためのコードです:

public static WindowsIdentity GetProcessIdentity(Process process) 
    { 
     SafeTokenHandle token = SafeTokenHandle.InvalidHandle; 
     try 
     { 
      if (!Methods.OpenProcessToken(process.Handle, TokenAccessLevels.Query | TokenAccessLevels.Duplicate, out token)) 
      { 
       throw new Win32Exception(); 
      } 
      return new WindowsIdentity(token.DangerousGetHandle()); 
     } 
     finally 
     { 
      token.Dispose(); 
     } 
    } 

    private static TokenElevationType GetTokenElevation(IntPtr token) 
    { 
     var elevationTypeLength = Marshal.SizeOf(typeof (int)); 
     var elevationType = (TokenElevationType) 0; 
     if (!Methods.GetTokenInformation(token, 
      TokenInformationClass.TokenElevationType, 
      ref elevationType, elevationTypeLength, out elevationTypeLength)) 
     { 
      throw new Win32Exception(); 
     } 
     return elevationType; 
    } 

    public static bool IsProcessElevated(Process process) 
    { 
     WindowsIdentity processIdentity = GetProcessIdentity(process); 
     var tokenElevation = GetTokenElevation(processIdentity.Token); 
     if (tokenElevation == TokenElevationType.Limited) 
     { 
      return false; 
     } 
     if (tokenElevation == TokenElevationType.Full) 
     { 
      return true; 
     } 
     // Do we have a Default elevation type? Then the process elevation status depends directly 
     // to the owner user being a member of the Administrative group. 
     return new WindowsPrincipal(processIdentity).IsInRole(WindowsBuiltInRole.Administrator); 
    } 
関連する問題