2009-07-31 10 views
14

前提条件の詳細現在のユーザーのSIDを取得する最善の方法は何ですか? .NET 2.0の中の作業

  1. コードは、ASP.Net、Windowsフォーム、またはコンソールアプリケーションから呼び出すことができる共通ライブラリにあります。
  2. 企業ネットワーク上のWindowsドメインで実行しています。

質問

現在のユーザーのSIDを取得するための最良の方法は何ですか?私はアプリケーションを実行している身元を話すのではなく、インターフェイスにアクセスしているユーザーについて話しています。背景アプリケーションとデスクトップベースのアプリケーションでは、これは実際にアプリケーションを実行するアイデンティティーである必要がありますが、ASP.Net(impersionationなし)ではHttpContext.Current.User SIDにする必要があります。

電流法

これは私が今持っているものです。それはちょうど間違っているようです。それは厄介です。これを行うより良い方法がありますか、それともあなたのためにそれを行うクラスに組み込まれているものがありますか?

public static SecurityIdentifier SID 
{ 
    get 
    { 
     WindowsIdentity identity = null; 

     if (HttpContext.Current == null) 
     { 
      identity = WindowsIdentity.GetCurrent(); 
     } 
     else 
     { 
      identity = HttpContext.Current.User.Identity as WindowsIdentity; 
     } 

     return identity.User; 
    } 
} 

答えて

3

私はこの情報の取得のより良い方法があるとは思わない - you'veは何とかのWindowsPrincipalで取得するようになったと.NETのではなくクリーンなAPIは、ユーザーオブジェクトの背後にあることを抽象化します。私はちょうどこれを残して、方法で包み込み、それを1日と呼ぶだろう。

あなたのWebユーザが(常に)がWindowsIdentityになる場合を除いて、あなたは何かすべきことがあります。

+1

ユーザは、常にアイデンティティを持っています(それ以上の問題がなければ)。答えをありがとう。 –

1

WindowsIdentityクラスは、「あなたのためにそれを行う組み込みクラス」です。あなたは、あなたが有効なWindowsIdentityを持っている限り、あなたが実際に得ようとしているような簡単な解決策を得ています。

また、問題のユーザーのユーザー名があり、ADから直接SIDを取得する場合は、独自のライブラリを作成してDirectoryServices名前空間を使用し、ユーザーのDirectoryEntryを取得することができます(これはかなりですDirectoryServicesのような複雑なプロセスは難しい)。必要があればLDAPを使用して入手することもできます。

0

サードパーティのライブラリを使用しない場合このコードは、ユーザーがユーザー名を変更した場合、正しい結果を示します。

String SID = ""; 
string currentUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString(); 

RegistryKey regDir = Registry.LocalMachine; 

      using (RegistryKey regKey = regDir.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData", true)) 
      { 
       if (regKey != null) 
       { 
        string[] valueNames = regKey.GetSubKeyNames(); 
        for (int i = 0; i < valueNames.Length; i++) 
        { 
         using (RegistryKey key = regKey.OpenSubKey(valueNames[i], true)) 
         { 
          string[] names = key.GetValueNames(); 
          for (int e = 0; e < names.Length; e++) 
          { 
           if (names[e] == "LoggedOnSAMUser") 
           { 
            if (key.GetValue(names[e]).ToString() == currentUserName) 
             SID = key.GetValue("LoggedOnUserSID").ToString(); 
           } 
          } 
         } 
        } 
       } 
      }MessageBox.Show(SID); 
関連する問題