Почему WellKnownSidType иногда не удается преобразовать в sid / account? - PullRequest
2 голосов
/ 18 февраля 2011

Вопрос: я ищу имя учетной записи и SID для каждого члена перечисления WellKnownSidType, как показано ниже.Почему это иногда терпит неудачу?И почему иногда не удается преобразовать WellKnownSidType в sid?Насколько я понимаю, только преобразование из sid в accountname иногда должно завершаться неудачей, и даже в том случае, если учетная запись не локальная и не находится в домене.

Например, при переводе enum LogonIdsSid в SID я получаю:Bekannte SIDs Typs LogonIdsSid können nicht erstellt werden.(Известные идентификаторы безопасности типа LogonIdsSid не могут быть созданы.)Или при поиске имени учетной записи для NTAuthoritySidя получаю: Manche oder alle identifitätsverweise konnten nicht übersetzt werden.(Некоторые или все 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);
        }
    }

}

1 Ответ

5 голосов
/ 18 февраля 2011

Этот метод фактически исключит три ошибки.

Первый - IdentityNotMappedException, что означает, что учетная запись, которую вы пытаетесь создать, на самом деле не существует на компьютере. Перечисление WellKnownSidType представляет все известные идентификаторы безопасности, а не только специфичные для данного компьютера. Вероятно, есть механизм, который вы можете использовать для поиска, но я не знаю об этом из рук вон. Возможно, вам придется P / Invoke и использовать CreateWellKnownSid или просто перехватить исключение.

Второй - ArgumentException, который произойдет, если вы попытаетесь использовать LogonIdsSid. Если вы посмотрите документацию для конструктора для SecurityIdentifier, вы увидите, что вы можете использовать LogonIdsSid.

Третья ошибка - ArgumentNullException, которая возникает, если вы попытаетесь создать один из следующих известных SID без указания SID домена. Это также в документации .

  • AccountAdministratorSid
  • AccountGuestSid
  • AccountKrbtgtSid
  • AccountDomainAdminsSid
  • AccountDomainUsersSid
  • AccountDomainGuestsSid
  • AccountComputersSid
  • AccountControllersSid
  • AccountCertAdminsSid
  • AccountSchemaAdminsSid
  • AccountEnterpriseAdminsSid
  • AccountPolicyAdminsSid
...