2009-09-17 1 views
1

적어도 파일 시스템 수정 권한이 있어야 BUILTIN \ Users 그룹의 사용 권한을 수정하려고합니다. 불행히도, 아래 코드를 사용하려고 시도해도 변경되지 않은 ACL이 생성됩니다.CommonAppDataPath 디렉터리의 C#에서 ACL Perms를 수정할 수 없습니다.

  SecurityIdentifier usersSecurityIdentifier = ntAccount.Translate(typeof(SecurityIdentifier)) as SecurityIdentifier; 
      DirectorySecurity directorySecurity = Directory.GetAccessControl(source.FullName); 
      FileSystemAccessRule accessRule 
       = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, AccessControlType.Allow); 

      directorySecurity.ModifyAccessRule(AccessControlModification.Add, 
       accessRule, 
       out modified); 

      Console.WriteLine(modified); 

수정 된 보고서는 모든 경우에 해당되지만 폴더 속성에서 볼 때 변경되지 않습니다.

비슷한 코드를 사용하는 디렉터리에 대한 ACL이 아직없는 SecurityIdentifier에 대한 액세스 규칙을 추가하려고했지만 수정 대신 AddAccessRule 만 추가했습니다. 새 SecurityIdentifier가 디렉토리의 perms 목록에 나타 났지만 지정한 액세스 권한이 없습니다.

관리자 계정이 소유자 인 Environment.SpecialFolders.CommonApplicationData의 독점 디렉터리에 대한 액세스 권한을 수정하려고합니다. 나는 또한 ACL을 관리자로 변경하기를 원합니다.

위의 코드가 잘못되었거나 네이티브 .NET 클래스를 사용하여 ACL을 설정하는 올바른 방법으로 나를 인도 할 수있는 리소스가있는 사람이 있습니까?

+0

다른 비스타 컴퓨터에서이 동작을 확인했습니다. CommonAppData 경로에서 데이터를 수정한다는 사실과 관련이있는 것으로 보입니다. –

+0

그래서이 관련 스레드를 발견하고 [여기] [1] 게시 할 것이라고 생각했습니다. 디렉터리를 만들 때 관리 계정에서 수행하는 설치 중에 디렉터리 사용 권한을 설정해야한다는 것이 핵심입니다. 나는 이것이 사용자 정의 액션과 Installer 클래스로 할 수 있다고 가정한다. 코드를 작성하고 실제로 이것이 사실임을 확인하면 여기서 내 솔루션을 게시 할 것입니다. [1] : http://www.vistax64.com/vista-security/165672-how-programmatically-modify-users-full-control.html –

답변

3

나는 Microsoft에서 일하는 친구의 도움을 통해 이것을 알아 냈습니다. 실제로 ACL을 설정하기 위해 사용했던 프로세스가 정확했습니다. 나는 결과를 잘못 해석하고 있었다. 기본적으로 관리자는 변경을 시도 할 때 관리자로 작동하는 한 디렉토리에 ACL을 설정하는 데 아무런 문제가 없습니다.

  • 고급을 클릭
  • 오른쪽 보안 탭을 선택
  • 을 클릭하여 해당 폴더 속성을 선택
  • 을 클릭

    1. : 폴더에 대한

      정확한 권한에 의해 (Vista에서)보기 할 수 있었다 편집

    2. 권한을 보려는 엔티티를 선택하고 편집을 클릭하십시오.

    이것은 내가 놓친 부분입니다. CommonApplicationData 경로에 이미 BUILTIN \ Users 엔티티에 대한 사용 권한이 설정되어 있습니다. 따라서 코드를 실행 한 후에 실제로 두 개의 엔티티로 끝납니다. 하나는 Read & Execute라고하고 다른 하나는 특수 권한을 말합니다. 특수 권한으로 엔티티를 편집 할 때 실제로 BUILTIN \ Users에 디렉토리에 대한 액세스 권한이 있음을 알 수 있습니다.

    저는 실제로 디렉터리와 모든 자식 폴더 및 개체에 대한 액세스 권한을 가진 BUILTIN \ Users를 찾고있었습니다. 다음은 내가 결국 사용했던 코드 스 니펫입니다. 테스트 코드를 통해 코드를 확인하고 수동으로 파일 및 디렉토리 ACL 목록을 검사 할 수 있었는지 확인할 수있었습니다.

    DirectorySecurity directorySecurity = Directory.GetAccessControl(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)); 
    FileSystemAccessRule accessRule 
        = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, 
         InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, 
         PropagationFlags.None, 
         AccessControlType.Allow); 
    
    bool modified=false; 
    directorySecurity.ModifyAccessRule(AccessControlModification.Add, 
        accessRule, 
        out modified); 
    
    if (modified) 
    { 
        source.Create(directorySecurity); 
    } 
    else 
    { 
        source.Create(); 
    } 
    
  • +0

    게시 해 주셔서 감사합니다. 코드 스 니펫의 _source_ 인스턴스 란 무엇입니까? 필요한 것인가? 또한이 코드는 다른 응용 프로그램의 공통 데이터를 포함하여 모든 CommonApplicationData 경로에 사용자가 모든 권한을 부여한다는 것을 올바르게 이해합니까? –

    +0

    이것은 DirectoryInfo 개체입니다. 이 코드의 목적은 사용자가 CommonApplicationData 경로에 대한 읽기/쓰기/삭제 액세스 권한을 가지게했기 때문입니다. 내가 찾은 것은 관리자가 경로를 만들고 디렉토리의 소유자 인 경우 사용자가 경로를 삭제할 수 없기 때문에 기본적으로이 코드를 작성하여 모든 사용자가 디렉토리에 액세스 할 수 있는지 그리고 삭제할 수 있는지 확인했습니다 그것. –

    관련 문제