c# - 为什么 WellKnownSidType 有时无法转换为 sid/account?

标签 c# .net asp.net vb.net permissions

问题:我正在查找每个 WellKnownSidType 枚举成员的帐户名和 SID,如下所示。

为什么有时会失败?
为什么有时无法将 WellKnownSidType 转换为 sid?
据我了解,只有从 sid 到帐户名的转换有时会失败,甚至只有当帐户不是本地且不在域中时才会失败。



例如,当将枚举 LogonIdsSid 转换为 SID 时,我得到:
Bekannte SID des Typs LogonIdsSid können nicht erstellt werden。
(无法创建 LogonIdsSid 类型的已知 SID。)

或者在查找 NTAuthoritySid 的帐户名时
我得到:Manche oder alle identitätsverweise konnten nicht übersetzt werden。
(部分或全部身份引用无法翻译。)

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);
        }
    }

}

最佳答案

这个方法实际上会排除三个错误。

第一个是IdentityNotMappedException这意味着您尝试创建的帐户实际上并不存在于计算机上。 WellKnownSidType 枚举表示所有众所周知的 SID,而不仅仅是特定于给定计算机的 SID。可能有一种机制可以用来查找此内容,但我不知道。您可能必须 P/Invoke 并使用 CreateWellKnownSid或者只是捕获异常。

第二个是 ArgumentException,如果您尝试使用 LogonIdsSid,就会发生这种情况。如果您检查documentation for the constructor对于 SecurityIdentifier,您会发现可以使用 LogonIdsSid

第三个错误是 ArgumentNullException,如果您尝试创建以下众所周知的 SID 之一而不指定域 SID,则会发生该错误。这也是in the documentation .

  • 帐户管理员Sid
  • 帐户GuestSid
  • 帐户KrbtgtSid
  • AccountDomainAdminsSid
  • AccountDomainUsersSid
  • AccountDomainGuestsSid
  • 帐户ComputersSid
  • AccountControllersSid
  • AccountCertAdminsSid
  • AccountSchemaAdminsSid
  • AccountEnterpriseAdminsSid
  • AccountPolicyAdminsSid
  • AccountRasAndIasServersSid

关于c# - 为什么 WellKnownSidType 有时无法转换为 sid/account?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5044473/

相关文章:

html - 如何将标题添加到表格底部?

ASP.NET App-设置IE7兼容模式吗?

c# - 使用 C# 和 ASP.NET 将数据从 Excel 文件导出到 SQL Server 表的最佳方法?

c# - 使相机跟随可以以恒定的高度和速度绕球体飞行

c# - GZip 往返截断 1 个或多个字节

.net - 如何在 .NET 中编写 Exif header 而不重新压缩 JPEG?

c# - 使用 Action<T> 创建任务

c#泛型基类方法返回派生类的类型

c# - java 和 c# 的 SHA1 哈希计算未返回相同的结果

JavaScript 对象 - 转换为 JSON 格式并传递给服务器端函数