0

私はときどきある Web サーバーから別の Web サーバーに Web サイトを移行します。

古いサーバーから新しいサーバーにすべてのファイルをコピーした後、どのフォルダーまたはファイルを IIS で書き込み可能にする必要があるかを (再) 理解するのにかなりの時間がかかります。(ちなみに、おなじみですね? :) )

開始ディレクトリを選択できる WinForms アプリケーションを作成しました。アプリケーションは、各ファイル/ディレクトリのセキュリティ権限がその親ディレクトリのセキュリティ権限と等しいかどうかを (再帰的に) 比較する必要があります。

このアプリケーションを古いサーバーで使用して、異なる権限を持つディレクトリをスキャンしたいと考えています。

例: C:\MySites\Uploads does not have the same permissions set as its parent directory. (このフォルダーは IIS ユーザー 'IUSR' に対して書き込み可能でしたが、その親フォルダーは読み取り専用でした。)

すべてのディレクトリとファイルをトラバースすることができたという意味で、アプリケーションはほぼ完成しています。私はちょうど彼らの許可を比較する必要があります!

助けていただけますか?ここにあなたの助けが必要な箇所の抜粋があります。

string results = "";

string parentFolderPath = "c:\\someParentDir";
string childItemPath = "c:\\someParentDir\\SomeChildDir.ext";

DirectorySecurity parentFolderAccessControl = Directory.GetAccessControl(parentFolderPath);
DirectorySecurity childItemAccessControl = Directory.GetAccessControl(childItemPath);

if (!parentFolderAccessControl.Equals(childItemAccessControl)) // <-- D'oh here
{
    results += childItemPath + " does not have the same permissions set as its parent directory.\n";
}

ifDirectorySecurities が等しくなることはないため、これは常に true です。(その理由は理解できます: 異なるメモリ割り当てへの参照... 何とか何とか。) しかし、DirectorySecurities を比較する最良の方法は何でしょうか?

4

2 に答える 2

1

このメソッドは Object から継承されているため、Equals() は使用できません。その DirectorySecurity クラスで識別属性を見つける必要があります。String GetSecurityDescriptorSddlForm() だと思います

あなたの仕事をすべきです。その上で Equals() を呼び出すことができます。

編集: 申し訳ありませんが、このメソッドには呼び出し用のパラメーターが必要です。比較に適した DirectorySecurity の別の属性を見つけてみてください。

Edit2: 私は .NET Security Framework と Right-Management に精通していませんが、このようなアプローチが必要です。その属性は列挙型 (内部的には int) であるため、FileSystemAccessRule.FileSystemRights で != resp: == を実行できます。

ArrayList notIdenticalList = new ArrayList(); 

        DirectorySecurity parentFolderAccessControl = Directory.GetAccessControl(null);
        DirectorySecurity childItemAccessControl = Directory.GetAccessControl(null);
        foreach (FileSystemAccessRule parentRule in parentFolderAccessControl.GetAccessRules(true, true, typeof(NTAccount)))
        {
            foreach (FileSystemAccessRule childRule in childItemAccessControl.GetAccessRules(true, true, typeof(NTAccount)))
            {
                if (parentRule.FileSystemRights != childRule.FileSystemRights)
                {
                    // add to not identical-list
                    notIdenticalList.Add(fileToAdd...);
                    break;
                }
            }
        }
于 2013-06-10T17:45:51.267 に答える