2012-07-13 6 views
1

네트워크의 특정 폴더에 대한 쓰기 권한을 얻을 수 있는지 확인해야하는 경우가 있습니다. 따라서 먼저 액세스 규칙에서 ID (도메인 그룹)의 일부인 사용자 또는 그룹 중 하나를 확인합니다. 그런 경우가 아니라면 원격 시스템의 모든 로컬 그룹을 검사하여 내 사용자 또는 사용자 그룹 중 하나가 시스템의 로컬 그룹 구성원인지 확인해야합니다. 예를 들어,이 특정 컴퓨터에서 BUILTIN \ Administrators의 구성원입니다. 즉, 주어진 폴더에 대한 쓰기 권한이 있습니다. 그러나 쓰기 권한이 있는지 확인하려면 원격 컴퓨터에서 해당 로컬 그룹을 가져 오는 방법을 명확히 알지 못합니다.네트워크에서 파일 사용 권한 받기

아래 코드에서 GroupPrincipal.FindByIdentity를 사용하려고하면 "바인딩 핸들이 잘못되었습니다."라는 예외가 발생합니다. 나는 무엇이 무효인지 명확하지 않다. 만약 내가 ctx.ValidateCredentials (UserName, Password)를 사용하여 내 사용자 이름과 암호 (도메인 사용자 이름)를 확인하려고하면 정확히 동일한 오류가 발생합니다.

컴퓨터 이름을 "pvr-pc"로 지정하면 네트워크에서 이름을 찾을 수 없다는 메시지가 표시되지만 "\\ pvr-pc"는 문제가 발생하지 않습니다.

내가 속한 그룹 중 하나가 내 로컬 시스템의 BUILTIN \ Administrators 그룹이므로 문제가되는 네트워크 액세스에 관한 내용입니다.

누구든지 내가 잘못 한 아이디어가 있습니까?

는 코드는 다음과 같습니다

using (WindowsIdentity identity = GetUserIdentity()) 
{ 
    if (identity != null) 
    { 
     try 
     { 

      FileInfo fi = new FileInfo(@"\\pvr-pc\c\installers\"); 
      AuthorizationRuleCollection acl = fi.GetAccessControl().GetAccessRules 
       (true, true, typeof (SecurityIdentifier)); 

      var rules = acl.Cast<FileSystemAccessRule>(); 

      List<string> sids = new List<string>(); 

      sids.Add(identity.User.Value); 

      sids.AddRange(identity.Groups.Select(identityReference => identityReference.Value)); 

      // check for a direct user match 
      var matches = from r in rules where sids.Contains(r.IdentityReference.Value) select r; 
      foreach (FileSystemAccessRule accessRule in matches) 
      { 
       // apply rules 
      } 

      foreach (FileSystemAccessRule rule in rules) 
      { 

       // if it is built in, try and get the group 
       var groupDetail = rule.IdentityReference.Translate(typeof (NTAccount)); 
       if (!groupDetail.Value.StartsWith("BUILTIN\\")) continue; 
       PrincipalContext ctx = new PrincipalContext(ContextType.Machine, @"\\pvr-pc", null, 
                  ContextOptions.Negotiate, UserName, Password); 

       GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Sid, 
                    rule.IdentityReference.Value); 
       if (grp != null) 
       { 
        //// find out if we are a member of the group 
        var isInGroup = (from g in grp.GetMembers(true) 
             where sids.Contains(g.Sid.ToString()) 
             select g).Any(); 
        if (isInGroup) 
        { 
         // apply rules 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 

     } 

감사합니다, 스테판

답변

1

단순히 읽거나 폴더에 쓰기 다음 예외를 잡기 쉬울 것; 사용자에게 액세스 권한이 없다는 것을 알립니다.

+0

그래, 내가 이런 식으로 할 수 없다면 분명히 할 수있는 일이다. 이 코드를 실행하는 시점에서 특별히 읽거나 쓰려고하는 것이 없으므로 임의의 파일을 읽거나 임의의 파일을 만들어야합니다. 할 수 있었다. FileInfo는 도움이 될 수있는 IsReadOnly 속성을 제공하지만 모든 상황에서 작동하는지 아직 확인하지 않은 테스트는 수행하지 않았습니다. – Stefan