C#を使用して、サーバーとマッピングされたドライブのACLSのリストを取得します
-
05-09-2019 - |
質問
私たちのITグループのプロダクションチェンジ実装者は、主に私たちの雇用を去った、または他のグループに転送した人がサーバー共有にアクセスできないことを確認するために、私たちのグループ内のすべてのさまざまなオブジェクトのセキュリティのレビューを任されています。 、Webディレクトリ、SQLデータベースなど。最近、SQL部分を完成させ、毎年(またはどんな頻度でも)再利用可能なスクリプトがあります。うまくいき、10分ほどのサーバーで20のデータベースを監査し、数分間監査しました。
さて、サーバーのもののために。 Directoriesのリストを再帰的にスキャンし、ACLをテキストファイルにダンプする.NET 2.0を使用してC#で書いたアプリケーションがあります。これは優れています。ローカルマシンで。 UNCとマッピングされたパスは機能しません。次の例外メッセージが表示されます。プロセスには、この操作に必要な「SESEcurityPrivilege」特権はありません。
この行で:
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
ここで、diはdirectoryInfo []配列から列挙されたディレクトリインフォオブジェクトです。
私たちは、sesecurityprivilegeの特権を付与されることはないでしょう。しかし、私はこれが必要だとは思わない。フォルダーを開いてプロパティを右クリックして[セキュリティ]タブをクリックして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();
}
編集:Rootフォルダーの「getAccessControl()」メソッドの取得に失敗した場合、ACLの読み取りattribのリモートフォルダーを確認するにはどうすればよいですか? ( server pathで渡すと、 server pathの情報を取得する際にエラーが発生します)。
ユーザーアカウントはドメインアカウントであり、ファイル構造を読み取る権限があります。フォルダー/ファイルのプロパティからセキュリティを表示できます。
プロセスモニターをチェックアウトしますが、サーバーで実行できるかどうかはわかりません(問題のサーバー上の管理者ではありません)。
解決
監査]タブのためにエラーが発生しますが、画面上で本当にアクセスしたいのは「許可」タブのデータだけだと確信しています。 SESECURITYPRIVILEGEは、SACLへのアクセスを制御します。
変更してみてください
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
に
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.Access);
次に、エラーの取得を停止する必要があります
他のヒント
リモートフォルダーがACLでコード読み取り属性を実行しているユーザーが付与することを確認します。
また、アクセス許可はリモート(サーバー)マシンで解決されるため、ローカルグループ(ユーザーと管理者)メンバーシップには、クライアントで実行されているユーザーアカウントが含まれない場合があります。
持っている プロセスモニター サーバーで実行されている(問題のフォルダー/ファイルにフィルタリングされている)は、それが失敗している理由の詳細を解決するのに役立つ場合があります。