2011-02-18 107 views
2

問題:我正在查找每個WellKnownSidType枚舉成員的帳戶名稱和SID,如下所示。

爲什麼它有時會失敗?
爲什麼它在將WellKnownSidType轉換爲sid時有時會失敗?
據我瞭解,只有從sid到accountname的轉換有時會失敗,甚至只有當賬戶不是本地的而且不在域中的時候。

WellKnownSidType爲什麼有時無法轉換爲sid /帳戶?



例如,平移所述枚舉LogonIdsSid到SID的情況下,我得到:
Bekannte的SID DES Typs LogonIdsSidkönnennicht標準化。創建werden。
(類型LogonIdsSid的已知的SID不能創建。)

或查找的帳戶名的NTAuthoritySid
當我得到:芒奧德全部identitätsverweisekonnten nichtübersetztwerden。
(部分或全部idendity引用不能轉換。)

Sub Main() 
    Enumerations.SidInfo(Of System.Security.Principal.WellKnownSidType)() 
End Sub 

Public Class Enumerations 

    Public Shared Sub SidInfo(Of T)() 
     Dim enumType As Type = GetType(T) 


     For Each ThisEnumValue As T In System.Enum.GetValues(GetType(T)) 
      Try 
       Console.WriteLine("Enum: System.Security.Principal.WellKnownSidType." + System.Enum.Format(GetType(T), ThisEnumValue, "G")) 
       Dim enumItem1 As System.Reflection.FieldInfo = enumType.GetField(System.Enum.Format(GetType(T), ThisEnumValue, "G")) 
       Dim enumValue1 As T = CType(enumItem1.GetValue(enumType), T) 
       Dim sid As System.Security.Principal.SecurityIdentifier = New System.Security.Principal.SecurityIdentifier(CType(CType(enumValue1, Object), System.Security.Principal.WellKnownSidType), Nothing) 
       Console.WriteLine("SID: " + sid.ToString()) 
       Dim ntAccount As Security.Principal.NTAccount = CType(sid.Translate(GetType(Security.Principal.NTAccount)), Security.Principal.NTAccount) 

       Console.WriteLine("Account: " + ntAccount.ToString()) 
       Console.WriteLine(vbCrLf) 
      Catch ex As Exception 
       Console.WriteLine("Exception on: " + System.Enum.Format(GetType(T), ThisEnumValue, "G")) 
       Console.WriteLine(vbCrLf) 
      End Try 
     Next 

    End Sub 
End Class 

C#(自動翻譯):

//Dim sid As System.Security.Principal.SecurityIdentifier = New System.Security.Principal.SecurityIdentifier(System.Security.Principal.WellKnownSidType.WorldSid, Nothing) 
//Dim rule As System.Security.AccessControl.MutexAccessRule = New System.Security.AccessControl.MutexAccessRule(sid, System.Security.AccessControl.MutexRights.FullControl, System.Security.AccessControl.AccessControlType.Allow) 
public static void GetSID<T>() 
{ 
    Type enumType = typeof(T); 

    foreach (T ThisEnumValue in System.Enum.GetValues(typeof(T))) { 
     try { 
      Console.WriteLine("Enum: System.Security.Principal.WellKnownSidType." + System.Enum.Format(typeof(T), ThisEnumValue, "G")); 
      System.Reflection.FieldInfo enumItem1 = enumType.GetField(System.Enum.Format(typeof(T), ThisEnumValue, "G")); 
      T enumValue1 = (T)enumItem1.GetValue(enumType); 
      System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier((System.Security.Principal.WellKnownSidType)(object)enumValue1, null); 
      Console.WriteLine("SID: " + sid.ToString()); 
      System.Security.Principal.NTAccount ntAccount = (Security.Principal.NTAccount)sid.Translate(typeof(Security.Principal.NTAccount)); 

      Console.WriteLine("Account: " + ntAccount.ToString()); 
      Console.WriteLine(Constants.vbCrLf); 
     } catch (Exception ex) { 
      Console.WriteLine("Exception on: " + System.Enum.Format(typeof(T), ThisEnumValue, "G") + Constants.vbCrLf + ex.Message); 
      Console.WriteLine(Constants.vbCrLf); 
     } 
    } 

} 
+0

你的意思是什麼樣的失敗?你得到一個例外嗎? – 2011-02-18 17:30:45

+0

@Chris Haas:添加了異常消息。 – 2011-02-18 17:38:42

回答

5

這種方法實際上踢了三個錯誤。

第一個是IdentityNotMappedException這意味着您試圖創建的帳戶實際上並不存在於機器上。 WellKnownSidType枚舉代表所有知名的SID,而不僅僅是特定於特定機器的SID。可能有一種機制可以用來查看,但我不知道它的影響。您可能必須進行P/Invoke並使用CreateWellKnownSid或者只是發現異常。

第二個是ArgumentException如果您嘗試使用LogonIdsSid會發生這種情況。如果您檢查documentation for the constructorSecurityIdentifier,您會看到您可以使用LogonIdsSid

第三個錯誤是ArgumentNullException如果您嘗試在不指定域SID的情況下創建以下某個知名SID,則會發生這種錯誤。這也是in the documentation

  • AccountAdministratorSid
  • AccountGuestSid
  • AccountKrbtgtSid
  • AccountDomainAdminsSid
  • AccountDomainUsersSid
  • AccountDomainGuestsSid
  • AccountComputersSid
  • AccountControllersSid
  • AccountCertAdminsSid
  • AccountSchemaAdminsSid
  • AccountEnterpriseAdminsSid
  • AccountPolicyAdminsSid
  • AccountRasAndIasServersSid
相關問題