2016-06-22 4 views
0
다음

는 내가 작성한 코드입니다C#에서 디렉터리에 대한 액세스 권한이 변경되었는지 확인하는 방법은 무엇입니까?

var prevSecInfo = Directory.GetAccessControl(path); 

if (Utilities.ShowChangePermissionsWindow(path)) { 

    var currSecInfo = Directory.GetAccessControl(path);  

    if (currSecInfo != prevSecInfo) 
     Utilities.ApplyPermissionsOnSubdirectories(path); 
} 

그래서 현재 내가 사용 권한 창을 표시하기 전에 액세스 제어 정보를 얻고있다.

다음으로 실제로 파일/폴더 속성 창의 보안 탭인 사용 권한 창을 표시합니다. 권한이 변경되면 권한이 변경 될 수 있습니다. 아무런 변경이없는 경우

Properties window with Security tab selected

하지만, 나는() 방법 내 ApplyPermissionsOnSubdirectories를 호출하고 싶지 않아요. 따라서 다른 변수에서 액세스 제어 정보를 다시 얻고 이전 및 현재 정보를 비교합니다.

하지만 이는 작동하지 않습니다. 사용 권한이 변경되지 않은 경우에도 비교는 false를 반환합니다.

주어진 경로에 대한 권한이 변경되었는지 어떻게 확인할 수 있습니까?

답변

1

이렇게하면 두 개의 참조 유형 개체의 내용을 비교할 수 없습니다.

if (currSecInfo != prevSecInfo)은 둘 다 동일한 객체를 참조하지 않는 한 항상 false를 반환합니다.

불행히도 DirectorySecurity 유형도 Equals 오버라이드 메소드를 제공하지 않습니다. 위의 문제에서 작업하는 동안
compare windows file (or folder) permissions

+0

링크를 제공해 주셔서 감사합니다. 이 솔루션이 도움이된다는 것을 알았습니다. http://stackoverflow.com/a/17047098/3511392 –

0

, 나는 코드의 관점 덜 복잡하고 더 짧은 보이는 또 다른 해결책을 발견 :

는 비교 권한에 대한 몇 가지 준비가 만든 솔루션과 함께 StackOverflow의 기사가있다. 여기

DirectorySecurity securityInfoBefore = Directory.GetAccessControl(path, AccessControlSections.Access); 
string aclStrBefore = securityInfoBefore.GetSecurityDescriptorSddlForm(AccessControlSections.Access).ToString(); 

path 파일/폴더의 절대 경로이다.

사용 권한이 변경되기 전에 DirectorySecurity 개체를 가져오고 SecurityDescriptorSddlForm을 문자열로 가져 오려고합니다.

이제 코드를 추가하여 권한을 변경할 수 있습니다. 사용 권한이 변경된 후 다음 코드를 추가하십시오.

DirectorySecurity securityInfoAfter = Directory.GetAccessControl(path, AccessControlSections.Access); 
string aclStrAfter = securityInfoAfter.GetSecurityDescriptorSddlForm(AccessControlSections.Access).ToString(); 

다음 단계는 앞뒤 문자열을 비교하는 것입니다.

if (aclStrBefore.Equals(aclStrAfter)) { 
    // permissions have not changed 
} else { 
    // permissions have changed 
} 

이것은 지금까지 도움이되었습니다. 언제든지 내 대답에 추가하거나 수정하십시오.

관련 문제