以编程方式向 WPF 中的文件添加写入权限

Posted

技术标签:

【中文标题】以编程方式向 WPF 中的文件添加写入权限【英文标题】:Programmatically adding Write permissions to files in WPF 【发布时间】:2011-08-10 06:04:13 【问题描述】:

在我的 WPF MVVM 应用程序中,我有一个 XML 文件要修改。 它在 Visual Studio 中成功运行。 但它在运行已安装的应用程序时显示错误。 如何通过代码设置权限..

我使用了这个代码,

// current security settings.
FileSecurity fSecurity = File.GetAccessControl(FilePath);

// Add the FileSystemAccessRule to the security settings.
string rr = WindowsIdentity.GetCurrent().Name;
fSecurity.AddAccessRule(new FileSystemAccessRule(WindowsIdentity.GetCurrent().Name,
            FileSystemRights.FullControl, AccessControlType.Allow));


// Set the new access settings.
File.SetAccessControl(FilePath, fSecurity);

仍然无法解决问题...,

提前谢谢..

查看异常...

System.UnauthorizedAccessException:试图执行 未经授权的操作。在 System.Security.AccessControl.Win32.SetSecurityInfo(ResourceType 类型, 字符串名称、SafeHandle 句柄、SecurityInfos 安全信息、 SecurityIdentifier 所有者、SecurityIdentifier 组、GenericAcl sacl、 GenericAcl dacl) 在 System.Security.AccessControl.NativeObjectSecurity.Persist(字符串 名称、SafeHandle 句柄、AccessControlSections includeSections、对象 异常上下文)在 System.Security.AccessControl.NativeObjectSecurity.Persist(字符串 名称、AccessControlSections 包括Sections、对象异常上下文) 在 System.Security.AccessControl.NativeObjectSecurity.Persist(字符串 名称,AccessControlSections includeSections)在 System.Security.AccessControl.FileSystemSecurity.Persist(字符串 fullPath)在 System.IO.File.SetAccessControl(字符串路径, 文件安全文件安全)

【问题讨论】:

【参考方案1】:

要设置权限,主要需要高级用户权限(假设您运行的是 Windows 7)。

要验证上述内容,请以“以管理员身份运行”启动 Visual Studio 并调试您的代码。

什么是确切的异常消息?

这是一个工作示例:它为用户组 EveryOne 设置完全权限

private static void WriteAcl ( string filename ) 
         
            //Set security for EveryOne Group
            SecurityIdentifier sid =new SecurityIdentifier(WellKnownSidType.WorldSid, null);
            IdentityReference userIdentity =sid.Translate (typeof(NTAccount));           

            var AccessRule_AllowEveryOne = new FileSystemAccessRule ( userIdentity, FileSystemRights.FullControl, AccessControlType.Allow );
            var securityDescriptor = new FileSecurity ();
            securityDescriptor.SetAccessRule ( AccessRule_AllowEveryOne );            
            File.SetAccessControl ( filename, securityDescriptor ); 
         

仅当用户帐户设置设置为从不通知时,此代码才有效。看起来它在您的计算机上已打开?

一种解决方法是使用应用程序清单以高级用户身份启动您的应用程序。

http://msdn.microsoft.com/en-us/library/bb756929.aspx

【讨论】:

为应用程序安装更改 UAS 是否正确?不这样做我得到了同样的例外.. 绝对开启 UAC 并以标准用户运行应用程序将引发异常。您可以手动分配权限或使用上述代码自动分配权限,并使用应用程序清单强制以管理员权限启动应用程序。至于对不对,要看情况和选择。我的最终用户没有足够的技术来设置权限......我更喜欢上面的方式。 “使用应用程序清单以管理员权限启动应用程序”。你能举个例子吗? @Needo 谢谢。你摇滚!你已经解决了我在一个家庭应用程序中遇到的一个问题,我已经考虑了很久。现在我需要查看所有这些安全类以了解它们在做什么。干杯!

以上是关于以编程方式向 WPF 中的文件添加写入权限的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式向文件夹添加权限

以编程方式将具有写入权限的 IIS_IUSRS 添加到目录

如何以编程方式检查 .NET 中的有效删除(修改)或写入权限?

以编程方式将控件添加到WPF表单

以编程方式将列和行添加到 WPF Datagrid

以编程方式 WPF DataGrid 行双击事件