2009-02-20 8 views
12

ITグループの生産変更実装者は、グループ内のさまざまなオブジェクトすべてのセキュリティを確認することが義務づけられています。私たちは雇用しているか、他のグループに譲渡して、サーバ共有、ウェブディレクトリ、SQLデータベースなどにアクセスできなくなった。我々は最近SQL部分を完成させ、毎年実行できる再利用可能なスクリプトを持っている私たちは思いつきます)。すばらしい成果を収め、数十分のうちに10台ほどのサーバーに20データベースを監査しました。C#を使用してサーバーとマップされたドライブのACLリストを取得

今、サーバー用のものです。私は、.NET 2.0を使用してC#で書いたアプリケーションを持っています。このアプリケーションは、ディレクトリのリストを再帰的にスキャンし、ACLをテキストファイルにダンプします。これは優れた作品です。ローカルマシン上。 UNCとマップされたパスが機能しない場合、次の例外メッセージが表示されます。この処理に必要な 'SeSecurityPrivilege'特権を所有していません。このラインで

ジDirectoryInfo []アレイから列挙DirectoryInfoオブジェクトである
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 

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で読み取りATTRIBのリモートフォルダを確認する方法を ? (\ server \ pathを渡すと、\ server \ pathの情報を取得する際にエラーが発生します)。

ユーザーアカウントはドメインアカウントで、ファイル構造を読み取る権限があります。私はフォルダ/ファイルのプロパティからセキュリティを見ることができます。

私はプロセスモニターをチェックアウトしますが、私はサーバー上で実行できるとは思っていません(私は問題のサーバーの管理者ではありません)。

+1

を取得して停止する必要があり

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.Access); 

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 

を変更してみてください。私はこのコードを使用して、私たちの内部システムの1つにファイル許可モニタを構築しました。 –

答えて

17

「監査」タブのためにエラーが表示されますが、本当に画面上でアクセスしたいのは「権限」タブのデータです。 SeSecurityPrivilegeは、SACLへのアクセスを制御します。

は、あなたがこの質問/コードサンプルは実際に非常に役立ちましたエラー

+0

Duh!なぜ私はそれらの他の列挙を見ていないのかわかりません。私は明日これを試し、私が得るものを見ます。ありがとう! – bdwakefield

+0

それはトリック、ありがとう! – bdwakefield

+0

良い、私は少し自分がエラーを得ることができなかったので心配していた... – uzbones

1

リモートフォルダーが、ACL内の読み取り属性コードを実行しているユーザーを許可していることを確認します。

リモート(サーバー)コンピュータでアクセス許可が解決されるため、ローカルグループ(ユーザーと管理者)のメンバシップには、クライアントで実行されているユーザーアカウントが含まれていない可能性があります。

サーバー上でProcess Monitorが実行されている(問題のフォルダ/ファイルにフィルタされている)と、失敗した理由の詳細を解決できます。

+0

上記の編集の注記を参照してください。 – bdwakefield

+0

Hmmm ...管理者権限がないと、あなたは奇妙な権限があるとか、そして/またはデバッグが非常に難しいと思うでしょう。 – Richard

関連する問題