1

내 회사에는 사용자 지정 HMI가 있습니다. 이 HMI는 사용자가 원할 경우 컴퓨터의 도메인을 사용하여 로그인 할 수 있습니다. 여기에 우리가 현재 사용자가 도메인 사용자로 Windows에 로그인으로도메인에 연결되지 않은 경우 Active Directory 도메인 그룹 목록을 가져 오는 방법

  1. 해결하기 위해 노력하고있는 시나리오이다, 그들은 동일한 Windows 자격 증명을 사용하여 HMI에 로그인 - 모든 것을 쉽게 추가 할 수 있습니다.

  2. 네트워크 연결이 끊어져 사용자가 컴퓨터를 다시 시작합니다.

  3. 사용자는

  4. 사용자를 (윈도우 캐시 사용자가이 허용와) 같은 도메인 로그온을 사용하기 전에로 Windows에 로그인 할 수 있습니다

    우리의 HMI에 로그인을 시도하고

  5. 그들은 내가하지 않았습니다 할 수 없기 때문에 이 캐싱 된 Active Directory 사용자에게 액세스하는 방법을 알아 냈습니다.

사용자가 HMI에 로그인 할 수있는 그룹 중 하나의 멤버인지 여부를 감지하기 위해 지금 사용하고있는 코드는 다음과 같습니다. 이 그룹은 우리의 SQL 데이터베이스에 저장되며,

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 방법에 예외가 있다는 것입니다 예를 들어 SERVER\BUILDER 같은 문자열로 저장됩니다. 메서드에서 오버로드를 살펴보고 리터럴 String 대신 user.Group에 해당하는 SID를 사용하여 시도했습니다. 이것은 효과가있는 것처럼 보이지만 이제는 또 다른 문제가 발생합니다. 사용자가 네트워크에 있지 않으면 그룹 이름 (SQL에서 문자열)을 이러한 SID로 변환 할 수 없습니다.

현재 사용자가 도메인에 연결되어있을 때 SID와 그룹을 조회 테이블 (암호화 됨)에 저장하고 네트워크가 연결되어 있지 않으면 데이터베이스에서 그룹 이름을 가져옵니다. 말 그대로 테이블에서 SID 문자열을 찾습니다.

내가 SID에 그룹 이름을 변환하는 데 사용하고 코드가 그럼 난 이렇게

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 

같은 그룹 이름을 조회

'' 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 

을 따르고

내가 번역 할 수없는 이유 IdentityReference.Translate은 도메인을 볼 수 없기 때문에 예외를 throw하기 때문에 네트워크에 있지 않을 때 그룹 이름을 SID에 추가해야합니다.

결국이 모든 설명을 마친 후 여기 내가 찾고있는 것이 있습니다. Windows가 어딘가에 저장해야하기 때문에 그룹 이름에서 SID를 가져올 수있는 액세스 권한이 있어야한다고 생각합니다. 그렇지 않으면 네트워크에 연결되지 않은 경우 Windows에 로그인 할 수 없습니다.

많은 검색을했는데 이러한 캐시 된 자격 증명이 저장된 위치를 파악할 수 없었습니다. 어떤 도움을 주시면 감사하겠습니다. 명확하지 않은 경우 알려 주시면 최선을 다해 설명하겠습니다.

답변

0

나는 그것이 오래되었다는 것을 알고있다. 그러나 그것은 나를 위해 실제적이었다. 익숙한 게시물로 다음 링크를 사용합니다. Determine User Active Directory Groups from Local Machine off Network

제안 된 솔루션은 SID를 로컬 공간에 저장하는 것이 가장 좋은 방법입니다.

+0

너도 알다시피, 나는 이것을 업데이트하는 것을 사실 잊어 버렸지 만, 이것이 결국 내가 한 일이다. 우리 데이터베이스에서 SIDS를 암호화했는데 작동하는 것 같습니다. 답변을 주셔서 감사합니다. – chris84948