как дать разрешение на файл, а не каталог - PullRequest
1 голос
/ 26 марта 2019

Я использую приведенный ниже код, чтобы дать разрешение на каталог

static void SetPermission(string path)
    {
        if (Directory.Exists(path))
        {
            var directoryInfo = new DirectoryInfo(path);

            // get the ACL of the directory
            var directorySecurity = directoryInfo.GetAccessControl();

            // remove inheritance, copying all entries so that they are direct ACEs
            directorySecurity.SetAccessRuleProtection(true, true);

            // do the operation on the directory
            directoryInfo.SetAccessControl(directorySecurity);

            // re-read the ACL
            directorySecurity = directoryInfo.GetAccessControl();

            // get the well known SID for "Users"
            var sid = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);

            // loop through every ACE in the ACL
            foreach (FileSystemAccessRule rule in directorySecurity.GetAccessRules(true, false, typeof(SecurityIdentifier)))
            {
                // if the current entry is one with the identity of "Users", remove it
                if (rule.IdentityReference == sid)
                    directorySecurity.RemoveAccessRule(rule);
            }

            var ntVirtaulUserName = @"NT Service\ServiceName";

            // Add the FileSystemAccessRule to the security settings. give full control for user 'NT Service\ServiceName' 
            directorySecurity.AddAccessRule(new FileSystemAccessRule(ntVirtaulUserName.Replace(@".\", ""), FileSystemRights.FullControl, AccessControlType.Allow));

            // do the operation on the directory
            directoryInfo.SetAccessControl(directorySecurity);
        }
    }

Это работает, когда даю разрешение на каталог (Test),

SetPermission(@"C:\Test");

Теперь яхотел бы дать разрешение на файл в каталоге Test (log.txt), как это сделать?

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Вы можете использовать FileInfo Class для обработки прав доступа к файлам.Его использование похоже на DirectoryInfo. Здесь - документ Microsoft.

    public static void AddFileSecurity(string FileName, string Account, FileSystemRights Rights, AccessControlType ControlType)
    {

        FileInfo fInfo = new FileInfo(FileName);
        FileSecurity fSecurity = fInfo.GetAccessControl();

        fSecurity.AddAccessRule(newFileSystemAccessRule(Account,Rights,ControlType));
        fInfo.SetAccessControl(fSecurity);

    }
0 голосов
/ 26 марта 2019

Код ниже подходит?

 var ntVirtaulUserName = @"NT Service\ServiceName";

            // Get a FileSecurity object that represents the
            // current security settings.
            FileSecurity fSecurity = File.GetAccessControl(@"C:\Test\log.txt");

            // Add the FileSystemAccessRule to the security settings.
            fSecurity.AddAccessRule(new FileSystemAccessRule(ntVirtaulUserName.Replace(@".\", ""), FileSystemRights.FullControl, AccessControlType.Allow));

            // Set the new access settings.
            File.SetAccessControl(@"C:\Test\log.txt", fSecurity);
...