ITグループの本番環境変更の実装者は、主に、退職した人や他のグループに異動した人がサーバー共有にアクセスできないようにするために、グループ内のさまざまなオブジェクトすべてのセキュリティを確認する必要があります。 、Webディレクトリ、SQLデータベースなど。最近SQLの部分が完了し、毎年(または思いついた頻度で)実行できる再利用可能なスクリプトがあります。それはうまく機能し、数分で10台ほどのサーバーにわたって20のデータベースを監査しました。
さて、サーバーのものについて。.NET 2.0を使用してC#で作成したアプリケーションがあります。このアプリケーションは、ディレクトリのリストを再帰的にスキャンし、ACLをテキストファイルにダンプします。これはうまく機能します。ローカルマシン上。UNCパスとマップパスが機能しない場合、次の例外メッセージが表示されます。プロセスには、この操作に必要な「SeSecurityPrivilege」特権がありません。
この行で:
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
ここで、diは、DirectoryInfo[]配列から列挙された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();
}
編集:ルートフォルダの「GetAccessControl()」メソッドの取得に失敗した場合、ACLの読み取り属性のリモートフォルダを確認するにはどうすればよいですか?(\ server \ pathを渡すと、\ server \ pathの情報を取得するときにエラーが発生します)。
ユーザーアカウントはドメインアカウントであり、ファイル構造を読み取るためのアクセス許可があります。フォルダ/ファイルのプロパティからセキュリティを確認できます。
プロセスモニターをチェックアウトしますが、サーバーで実行できるかどうかわかりません(私は問題のサーバーの管理者ではありません)。