私の会社では、カスタム HMI を使用しています。この HMI は、ユーザーが希望する場合、コンピュータのドメインを使用してログインできます。これが現在解決しようとしているシナリオです
ユーザーがドメイン ユーザーとして Windows にログインすると、同じ Windows 資格情報を使用して HMI にログインします。すべてがスムーズに進みます。
ネットワーク接続がダウンし、ユーザーがコンピューターを再起動します。
ユーザーは、同じドメイン ログオンを使用する前と同じように Windows にログインできます (これを許可する Windows キャッシュ ユーザーを使用)。
ユーザーが 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 にログインできません。
私は多くの検索を行いましたが、これらのキャッシュされた資格情報がどこに保存されているかを突き止めることができませんでした. 私が十分に明確でない場合はお知らせください。できる限り説明します。