【问题标题】:Some or all identity references could not be translated c#部分或全部身份引用无法翻译c#
【发布时间】:2014-11-12 17:05:28
【问题描述】:

我试图授予用户访问文件夹的权限,但是当我尝试运行程序时,错误提示:Some or all identity references could not be translated

这是我正在使用的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Security;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Management;
using System.Management.Instrumentation;

namespace FolderLock
{
    public partial class Lock : Form
    {
        public Lock()
        {
            InitializeComponent();

            SetAccess();
        }

        private void Lock_Load(object sender, EventArgs e)
        {

        }

        public void SetAccess()
        {
            DirectoryInfo myDirectoryInfo = new DirectoryInfo("C:/Users/Trov/Desktop/Test");

            DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();

            string User = System.Environment.UserDomainName + "\\" + "92111092";

            myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(User, FileSystemRights.Read, AccessControlType.Deny));

            myDirectoryInfo.SetAccessControl(myDirectorySecurity);
        }

    }
}

【问题讨论】:

  • 哪一行出错了?
  • 此行先生:myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(User, FileSystemRights.Read, AccessControlType.Deny));
  • 您尝试为其设置访问权限的帐户是否确实存在?错误消息实际上是一个 IdentityNotMappedException,它“表示其身份无法映射到已知身份的主体的异常”。当我尝试使用名为“92111092”的帐户时会得到它,并且在使用真实帐户名时也不会出现异常。
  • 是的,您说得对,先生,当我尝试使用计算机上实际存在的帐户名时,它可以正常工作。但是先生,如果我在计算机 A 上安装了这个程序(计算机 A 的用户帐户名为“92111092”),而我在计算机 B 上安装了这个程序(计算机 B 的用户帐户名为“92111092”),该怎么办?但我希望计算机 B 也无法使用计算机 B 中不存在的“92111092”访问“测试”文件夹。谢谢。
  • 您不能为不存在的帐户设置 ACL;但是,您可以设置默认情况下拒绝所有用户访问的 ACL,然后为应该有权访问的特定用户添加 ALLOW ACL。

标签: c#


【解决方案1】:

我找到了一种方法,而不是尝试允许或拒绝特定用户对文件夹的访问,我只是创建一个众所周知的经过身份验证的用户来拒绝或允许它访问文件夹。

代码如下:

public void SetAccess()
        {
            DirectoryInfo myDirectoryInfo = new DirectoryInfo(@"C:/Users/Trov/Desktop/Test");

            var sid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null); 

            DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();

            myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Read, AccessControlType.Deny));

            myDirectoryInfo.SetAccessControl(myDirectorySecurity);

            this.Hide();

            this.Close();
        }

谢谢

【讨论】:

  • 使用 SID 而不是用户名解决了我的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2012-07-16
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多