C#을 사용하여 서버 및 맵핑 된 드라이브 용 ACL 목록을 얻습니다.
-
05-09-2019 - |
문제
IT 그룹의 생산 변경 구현자는 우리 그룹의 모든 다양한 객체에 대한 보안을 검토해야합니다. , 웹 디렉토리, SQL 데이터베이스 등 우리는 최근 SQL 부분을 완료했으며 매년 (또는 어떤 빈도로 무엇이든) 실행할 수있는 재사용 가능한 스크립트가 있습니다. 그것은 훌륭하게 작동했으며 우리는 몇 분 동안 10 개 정도의 서버에서 20 개의 데이터베이스를 감사했습니다.
이제 서버 작업을 위해. .NET 2.0을 사용하여 C#에 쓴 응용 프로그램이있어 디렉토리 목록을 재귀 적으로 스캔하고 ACL을 텍스트 파일로 덤프합니다. 이것은 훌륭하게 작동합니다. 로컬 기계에서. UNC 및 매핑 경로는 작동하지 않습니다. 다음과 같은 예외 메시지가 표시됩니다. 프로세스는이 작업에 필요한 'SesecurityPrivilege'권한이 없습니다.
이 라인에서 :
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
여기서 di는 directoryInfo [] 배열에서 열거 된 디렉토리 인포 객체입니다.
우리는 sesecurity -privilege 특권을 부여받을 수 없을 것입니다. 그러나 나는 이것이 필요하다고 생각하지 않습니다. 폴더를 열고 오른쪽 클릭하여 속성을 클릭하고 보안 탭을 클릭하여 GUI에서 볼 수 있습니다. 나 ~해야 한다 프로그래밍 방식으로도 액세스 할 수 있습니다.
대상 폴더에 대한 권한을 얻기 위해이 코드 섹션을 변경할 수있는 방법에 대한 생각이 있습니까?
private void CheckSecurity(DirectoryInfo[] DIArray)
{
foreach (DirectoryInfo di in DIArray)
{
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
string sAccessInfo = string.Empty;
foreach (FileSystemAccessRule FSAR in DirSec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{
sAccessInfo += GetAceInformation(FSAR);
}
if (sAccessInfo != string.Empty)
{
// Write info to text file
}
}
}
private string GetAceInformation(FileSystemAccessRule ace)
{
StringBuilder info = new StringBuilder();
string line = string.Format("Account: {0}", ace.IdentityReference.Value);
info.AppendLine(line);
line = string.Format("Type: {0}", ace.AccessControlType);
info.AppendLine(line);
line = string.Format("Rights: {0}", ace.FileSystemRights);
info.AppendLine(line);
line = string.Format("Inherited ACE: {0}", ace.IsInherited);
info.AppendLine(line);
return info.ToString();
}
편집 : 루트 폴더의 "getAccessControl ()"메소드를 얻는 데 실패 할 때 ACL에서 Read Attrib의 원격 폴더를 어떻게 확인합니까? ( server path를 통과하면 server path에 대한 정보를 얻는 데 오류가 발생합니다).
사용자 계정은 도메인 계정이며 파일 구조를 읽을 권한이 있습니다. 폴더/파일의 속성에서 보안을 볼 수 있습니다.
프로세스 모니터를 확인하지만 서버에서 실행할 수 있을지 확신하지 못합니다 (문제의 서버의 관리자가 아닙니다).
해결책
'감사'탭으로 인해 오류가 발생하지만 화면에서 실제로 액세스하고 싶은 것은 '권한'탭의 데이터라고 확신합니다. sesecurity -privilege는 SACL에 대한 액세스를 제어합니다.
변경해보십시오
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
에게
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.Access);
그런 다음 오류가 발생하지 않아야합니다
다른 팁
원격 폴더가 ACL에서 코드 읽기 속성을 실행하는 사용자에게 부여하는지 확인하십시오.
또한이 권한은 원격 (서버) 기계에서 해결되므로 로컬 그룹 (사용자 및 관리자) 멤버십에는 클라이언트에서 실행되는 사용자 계정이 포함되지 않을 수 있습니다.
was 프로세스 모니터 서버에서 실행 (문제의 폴더/파일로 필터링)하면 실패한 이유에 대한 세부 정보를 해결하는 데 도움이 될 수 있습니다.