2012-07-15 3 views
3

C# 응용 프로그램을 개발 중입니다.존재하지 않는 사용자가 소유 한 폴더에서 ACL을 제거하는 방법

관리자 권한으로 내 프로그램을 실행하고 있으므로 모든 항목이 올바르게 작동하도록 폴더의 ACL을 변경해야합니다.

문제는 폴더를 소유 한 사용자가 시스템에서 삭제 된 경우 폴더에 대한 소유권을 가져 오려고 할 때 승인되지 않은 예외가 발생한다는 것입니다. 예외가 발생

라인
using (new PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership)) 
      { 
       var directorySecurity = directoryInfo.GetAccessControl(); 
       directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User); 
       Directory.SetAccessControl(directoryInfo.FullName, directorySecurity); 
      } 

:

은 실패 코드를 directoryInfo.GetAccessControl();

PrivilegeEnabler는 Process Privileges에 정의 된 클래스이며 파일에 대한 소유권을 가져 오는 데 사용됩니다.

+0

stacktrace 및 전체 예외 메시지를 게시 할 수 있습니까? – Luxspes

+1

[설명] (http://stackoverflow.com/questions/11384220/getnamedsecurityinfo-returns-error-access-denied5-when-writting-owner-of-a-rem/11385551#11385551). 즉, 권한을 읽을 수있는 권한이 없으면 소유권을 얻을 수 있습니다. 따라서 소유권을 가져와 ACL을 읽고 업데이트해야합니다. 내가 C#에서 편리하게 이것을 할 수 있다면 나는 모른다. – arx

+0

[이 질문에 대한 답변] (http://stackoverflow.com/questions/5241718/taking-ownership-of-files-with-broken-permissions)이 방법에 대해 설명합니다. – arx

답변

3

해결책을 찾았습니다.

(GetAccessControl을 호출하지 않고) 새 액세스 제어를 만들고 소유자를 현재 프로세스로 설정하여 소유자를 설정해야합니다. 그리고 나서 파일로 원하는대로 할 수 있습니다.

using (new PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership)) 
      { 
       //create empty directory security 
       var directorySecurity = new DirectorySecurity(); 
       //set the directory owner to current user 
       directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User); 
       //set the access control 
       Directory.SetAccessControl(directoryInfo.FullName, directorySecurity); 
      } 
관련 문제