【问题标题】:How To Get List Of Active Directory Domain Groups When Not Connected To Domain未连接到域时如何获取 Active Directory 域组列表
【发布时间】:2013-05-22 01:27:53
【问题描述】:

在我的公司,我们有一个定制的 HMI。如果用户愿意,此 HMI 可以使用计算机的域登录。这是我们目前正在尝试解决的场景

  1. 用户以域用户身份登录到 Windows 后,他们使用相同的 Windows 凭据登录到 HMI - 一切顺利。

  2. 网络连接中断,用户重新启动计算机。

  3. 用户可以像以前一样使用相同的域登录方式登录到 Windows(Windows 缓存用户允许这样做)

  4. 用户尝试登录我们的 HMI,但他们无法登录,因为我还没有弄清楚如何访问这些缓存的活动目录用户。

这是我现在用来检测用户是否属于允许登录 HMI 的组之一的代码。这些组存储在我们的 SQL 数据库中,并以字符串形式存储,例如 SERVER\BUILDER

If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then
            tempWindowsIdentity = New WindowsIdentity(tokenDuplicate)
            AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
            WinPrincipal = New WindowsPrincipal(tempWindowsIdentity)
End If

If WinPrincipal.IsInRole(user.Group) Then
            'Success - obviously there's more code after this
End If

问题是,当用户未连接到域时,IsInRole 方法出现异常。我查看了方法中的重载,并尝试使用与 user.Group 等效的 SID 而不是文字字符串。这似乎可行,但现在又出现了另一个问题。当用户不在网络上时,我无法将组名(来自 SQL 的字符串)转换为这些 SID。

我目前的解决方法是,当用户连接到域时,我将 SID 和组保存到查找表(加密)中,然后当网络未连接时,我从数据库中获取组名并按字面意思在表中查找 SID 字符串。

我用来将组名转换为 SID 的代码如下

'' Get all groups available to the user
        For i As Integer = 0 To WindowsIdentity.GetCurrent.Groups.Count - 1
            Dim ir As IdentityReference = WindowsIdentity.GetCurrent.Groups(i)
            sid(i) = New SecurityIdentifier(ir.Value)
            sidName(i) = CType(ir.Translate(GetType(NTAccount)), NTAccount).Value

            ' Write to file as csv
            writer.WriteLine(sidName(i) + "," + sid(i).ToString)
        Next

然后我像这样查找组名

If File.Exists(FILEPATH) = True Then
        Dim reader As New StreamReader(FILEPATH)
        While Not reader.EndOfStream
            Dim sTemp() As String = reader.ReadLine.Split(",")
            If groupName.Equals(sTemp(0)) Then
                Return New SecurityIdentifier(sTemp(1))
            End If
        End While
    End If

不在网络上时我无法将组名转换为 SID 的原因是 IdentityReference.Translate 抛出异常,因为它看不到域。

所以,在所有这些解释之后,这就是我要寻找的东西。我在想我必须在某个地方访问才能从组名中获取 SID,因为 Windows 必须将它存储在某个地方,否则在未连接到网络时我将无法登录到 Windows。

我进行了大量搜索,但无法弄清楚这些缓存凭据的存储位置。任何帮助将不胜感激,如果我不够清楚,请告诉我,我会尽力解释。

【问题讨论】:

    标签: dns active-directory sid active-directory-group windows-principal


    【解决方案1】:

    我知道它很旧,但它对我来说是真实的。 作为一个熟悉的帖子,我将链接此:Determine User Active Directory Groups from Local Machine off Network

    建议的解决方案是将 SID 存储在本地空间中,这似乎是最好的主意。

    【讨论】:

    • 你知道,我实际上忘了更新这个,但这就是我最终做的。我在我们的数据库中加密了 SIDS,它似乎可以工作。不过感谢您的回答。
    猜你喜欢
    • 2010-09-06
    • 2020-07-02
    • 2016-04-04
    • 2010-09-24
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多