文件夹权限 - 无法翻译部分或全部身份参考

时间:2014-12-31 09:29:56

标签: c#

我想在远程服务器上为域用户设置文件夹ACL,但始终会出现以下错误消息:

  

无法翻译部分或全部身份参考

我做错了什么?

这是我的代码:

string folderPath = @"\\remoteServer\testDirectory"     
string accountName = "domainUser"
string domainName = "mydomain";
accountName = domainName + "\\" + accountName;
//What rights are we setting?

//set on dir itself
FileSystemAccessRule accessRule = new FileSystemAccessRule(accountName, FileSystemRights.FullControl, AccessControlType.Allow);

DirectoryInfo dInfo = new DirectoryInfo(folderPath);
DirectorySecurity dSecurity = dInfo.GetAccessControl();
//dInfo.SetAccessControl(dSecurity);

dSecurity.AddAccessRule(accessRule);`

如果我仅输入userName而不是domainname\username,则会设置权限,但使用"未知帐户"

有人可以帮忙......

提前致谢。

3 个答案:

答案 0 :(得分:3)

我找到了解决这个问题的方法。 必须创建使用您要允许的用户的SID创建的SecurityIdentifier对象。 请参阅我的解决方案代码。

https://social.msdn.microsoft.com/Forums/de-DE/682e88c0-e044-46f9-8b5d-55f185e85a1a/directory-acl-berechtigung?forum=visualcsharpde&prof=required

答案 1 :(得分:1)

改善HeonAle的答案:

.net中未定义GetPrincipalBySamAccountName()方法。

因此,我们需要一种获取具有SID的Principal的方法。

对于用户:

                // set up domain context
                PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

                // find a user
                UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "UserName");
                string sid = user.Sid.ToString();

对于组:

                PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
                GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "GroupName");
                string sid = group.Sid.ToString();

然后,其余部分相同:

SecurityIdentifier secIdentifierSid = new SecurityIdentifier ( sid );  
FileSystemAccessRule AccessRule = new FileSystemAccessRule ( secIdentifierSid , FileSystemRights.FullControl, AccessControlType.Allow );

答案 2 :(得分:0)

通过布莱恩的链接:

// Get User from AD with System.DirectoryServices.AccountManagement; 
UserPrincipal user = GetPrinicpalBySamAccountName ( "userSamAccount" ); 
string usersid = user.Sid.ToString ();

SecurityIdentifier secIdentifierSid = new SecurityIdentifier ( usersid );  
FileSystemAccessRule AccessRule = new FileSystemAccessRule ( secIdentifierSid , FileSystemRights.FullControl, AccessControlType.Allow );

我将其更改为使用我们创建的SecurityIdentifier,而不是简单地发送SID。这似乎可行。