1

在我的公司,我们有一个定制的 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。

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

4

1 回答 1

0

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

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

于 2014-02-20T10:52:53.863 回答