5

フォルダをコピーして、属性、権限、セキュリティ設定など、別の場所に転送できるプログラムを作成しています。

これまでのところ、アトリビューションは機能していますが、権限/セキュリティ設定に問題があります。これが私のコードです:

Directory.CreateDirectory(Destination);
DirectoryInfo DestAttribute = new DirectoryInfo(Destination);
DestAttribute.Attributes = Source.Attributes; // Copies Attributes from Source to Dest

AuthorizationRuleCollection Rule;
DirectorySecurity DestSecurity = Source.GetAccessControl();
Rule = DestSecurity.GetAccessRules(true, true, typeof(NTAccount));
DestSecurity.AddAccessRule(Rule);
DestAttribute.SetAccessControl(DestSecurity);

誰かがこれを機能させるための提案がありますか?みなさん、ありがとうございました。

4

4 に答える 4

3

これは次の複製のようです:

元の質問...

(元の質問のコードサンプル)

FileInfo file1 = new FileInfo(@"c:\test.txt");
FileInfo file2 = new FileInfo(@"c:\test2.txt");
StreamReader sr1 = new StreamReader(file1.Open(FileMode.Open));
StreamWriter sw1 = new StreamWriter(file2.Open(FileMode.Create));
sw1.Write(sr1.ReadToEnd());
sr1.Close();
sw1.Close();
FileSecurity ac1 = file1.GetAccessControl();
ac1.SetAccessRuleProtection(true, true);
file2.SetAccessControl(ac1);

私は次の方法をまとめましたが、あなたが望むことをしているようです...

private static void FolderCopy(String sourceFolder, String destinationFolder)
{
    DirectoryInfo sourceDirectory = new DirectoryInfo(sourceFolder);
    DirectoryInfo destinationDirectory;

    if (!sourceDirectory.Exists)
    {
        throw new DirectoryNotFoundException("Source folder not found: " + sourceFolder);
    }

    if (!Directory.Exists(destinationFolder))
    {
        destinationDirectory = Directory.CreateDirectory(destinationFolder);
    }
    else
    {
        destinationDirectory = new DirectoryInfo(destinationFolder);
    }

    DirectorySecurity security = sourceDirectory.GetAccessControl();

    security.SetAccessRuleProtection(true, true);
    destinationDirectory.SetAccessControl(security);

    var filesToCopy = sourceDirectory.GetFiles();

    foreach (FileInfo file in filesToCopy)
    {
        String path = Path.Combine(destinationFolder, file.Name);
        FileSecurity fileSecurity = file.GetAccessControl();

        fileSecurity.SetAccessRuleProtection(true, true);

        file.CopyTo(path, false);

        FileInfo copiedFile = new FileInfo(path);

        copiedFile.SetAccessControl(fileSecurity);
    }
}

クリス

于 2012-07-18T03:21:46.160 に答える
2

Chris Keller の回答に基づく再帰バージョン

    /// <summary>
    /// Copy directory recursive with permissions, overwrite existing
    /// </summary>
    /// <param name="sourceFolder"></param>
    /// <param name="destinationFolder"></param>
    public static void CopyDirectory(string sourceFolder, string destinationFolder)
    {
        var sourceDirectory = new DirectoryInfo(sourceFolder);
        if (!sourceDirectory.Exists) throw new DirectoryNotFoundException("Source folder not found: " + sourceFolder);

        var destinationDirectory = !Directory.Exists(destinationFolder) ? Directory.CreateDirectory(destinationFolder) : new DirectoryInfo(destinationFolder);

        CopyDirectory(sourceDirectory,destinationDirectory);
    }

    public static void CopyDirectory(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory)
    {
        if(sourceDirectory == null) throw new ArgumentException("sourceDirectory");
        if(destinationDirectory == null) throw new ArgumentException("destinationDirectory");

        var security = sourceDirectory.GetAccessControl();

        security.SetAccessRuleProtection(true, true);
        destinationDirectory.SetAccessControl(security);

        var dirsToCopy = sourceDirectory.GetDirectories();
        foreach (var dirToCopy in dirsToCopy)
        {
            var destSubDirPath = Path.Combine(destinationDirectory.FullName,dirToCopy.Name);
            var destinationSubDir = !Directory.Exists(destSubDirPath) ? Directory.CreateDirectory(destSubDirPath) : new DirectoryInfo(destSubDirPath);
            CopyDirectory(dirToCopy,destinationSubDir);
        }

        var filesToCopy = sourceDirectory.GetFiles();

        foreach (var file in filesToCopy)
        {
            CopyFile(file, destinationDirectory.FullName);
        }
    }

    private static void CopyFile(FileInfo file, string destinationDirectory)
    {
        var path = Path.Combine(destinationDirectory, file.Name);
        var fileSecurity = file.GetAccessControl();

        fileSecurity.SetAccessRuleProtection(true, true);

        file.CopyTo(path, true);

        var copiedFile = new FileInfo(path);

        copiedFile.SetAccessControl(fileSecurity);
    }
于 2016-05-24T10:54:08.890 に答える
0

しばらくして、ようやくそれを機能させる方法を見つけました。目的は、あるフォルダー (ファイルではない) からアクセス許可をコピーし、それを別のフォルダーに転送することでした。(権限: アカウント設定、アクセス ルールなど...)

これが私が行った方法です:(ヘルプ: http://forums.asp.net/t/1390009.aspx/1 )

    private void PermissionGet(DirectoryInfo Source, DirectoryInfo Destination)
    {
        string Username;
        DirectorySecurity SourceSecurity = Source.GetAccessControl();

        foreach (FileSystemAccessRule Rules in SourceSecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
        {
            Username = Rules.IdentityReference.Value;
            PermissionSet(Username, Rules.FileSystemRights, Rules.AccessControlType, Destination);
        }
    }

    private void PermissionSet(string Username, FileSystemRights Permission, AccessControlType Access, DirectoryInfo Destination)
    {
        DirectorySecurity Security = Destination.GetAccessControl();
        Security.AddAccessRule(new FileSystemAccessRule(Username, Permission, Access));
        Destination.SetAccessControl(Security);
    }
于 2012-07-18T07:47:43.363 に答える