1

私の会社では、カスタム HMI を使用しています。この HMI は、ユーザーが希望する場合、コンピュータのドメインを使用してログインできます。これが現在解決しようとしているシナリオです

  1. ユーザーがドメイン ユーザーとして Windows にログインすると、同じ Windows 資格情報を使用して HMI にログインします。すべてがスムーズに進みます。

  2. ネットワーク接続がダウンし、ユーザーがコンピューターを再起動します。

  3. ユーザーは、同じドメイン ログオンを使用する前と同じように Windows にログインできます (これを許可する Windows キャッシュ ユーザーを使用)。

  4. ユーザーが HMI にログインしようとしましたが、これらのキャッシュされた Active Directory ユーザーにアクセスする方法がわからなかったため、ログインできませんでした。

ユーザーが 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メソッドで例外が発生することです。メソッドのオーバーロードを調べて、リテラル String の代わりに 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

私はそれが古いことを知っていますが、私にとっては現実的でした。おなじみの投稿として、これをリンクします:ネットワークから離れたローカル マシンからユーザー Active Directory グループを決定する

提案された解決策は、SID をローカル空間に格納することでした。これが最良のアイデアと思われます。

于 2014-02-20T10:52:53.863 に答える