2011-03-01 2 views
0

.NET을 사용하여 프로그래밍 방식으로 Windows 사용자가 구성원 인 모든 그룹 및 로그인 된 사용자를 나타내는 다른 모든 SID (보안 식별자)의 목록을 얻고 싶습니다. 결과 목록에는 다음을 포함해야합니다.Windows 사용자와 일치하는 모든 SID (보안 식별자)를 얻는 방법?

  1. 사용자가 직접 작성해야합니다.
  2. 그는 직접 부재 그 간접 사용자에게
  3. WellKnownSidType의 그 매치되는
  4. 중첩 그룹되는 그룹. 예를 들면 :
    • 모두
    • NT AUTHORITY \ 인증 된 사용자
    • ...

첫 번째 항목이 사소한 내가 이미 System.DirectoryServices과를 사용하여 포인트 2와 3을 검색 할 수 있습니다 내 사용자를 나타내는 DirectoryEntrytokenGroups 속성은 this example입니다.

누군가는 쉬운 방법을 원한다면이

답변

2

, 내가 UserPrincipal.GetAuthorizationGroups 정말 쉽게 말을 할 수있는 (쉬운) 방법을 찾을 수 있습니다. 유일한 것은 .NET 3.5 이상에서만 찾을 수 있다는 것입니다.

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "yourdomain.com")) 
{ 
    using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "YourUser")) 
    { 
     foreach (Principal p in user.GetAuthorizationGroups()) 
     { 
      Console.WriteLine(p.Name); 
     } 
    } 
} 

GetAuthorizationGroups은 잘 알려진 SID를 포함하여 모든 중첩 그룹을 반환합니다. 중첩 된 그룹 정보를 검색하는 여러 가지 방법을 시도합니다. 실제로 사용 된 접근 방법 중 하나는 DirectoryEntry을 사용하여 tokenGroups 속성에 액세스하는 것입니다.

UPDATE

는 현재 사용자가 NT AUTHORITY\INTERACTIVE 또는 LOCAL, 우리는 토큰 직접 현재 로그온을 검색 WindowsIdentity.Groups를 사용할 수 있는지 여부를 확인합니다. NT AUTHORITY\INTERACTIVELOCAL의 멤버십은 런타임에 결정됩니다. 사용자는 해당 시스템에 지금 로그온하고 있다는 사실을 기반으로 이러한 그룹에 할당됩니다. 마찬가지로 내 Windows 7에서 원격 데스크톱을 통해 로그온했기 때문에 현재 로그온 사용자도 NT AUTHORITY\REMOTE INTERACTIVE LOGON의 구성원임을 알 수 있습니다.

WindowsIdentity id = WindowsIdentity.GetCurrent(); 
foreach (var group in id.Groups) 
{ 
    Console.WriteLine(((NTAccount)group.Translate(typeof(NTAccount))).Value); 
} 

은 내가 어떤 임의의 사용자에 대한 NT AUTHORITY\INTERACTIVE 회원 자격을 얻을 수있는 방법을 몰라 죄송합니다. 이러한 유형의 그룹 구성원은 런타임에 해당 사용자가 실제로 로그온하는 경우에만 결정되기 때문에 그러한 방법이 없다고 생각합니다.

+0

감사합니다. Harvey에게 솔루션에는 거의 모든 것이 포함되어 있습니다. 그것은 여전히 ​​(로컬, 콘솔 로그온, NT AUTHORITY \ INTERACTIVE ...) 일부 SID가 여전히 누락되었습니다. 어떻게 그 아이디어를 얻을 수 있을까요? –

+0

@Marcel 업데이트 된 답변을 확인하십시오 –

+0

감사합니다 Harvey, 귀하의 예와 설명이 완벽 이상입니다. –

관련 문제