c#程序运行时经常遇到文件或文件夹权限问题,导致程序运行失败。为了解决这个头疼的问题,我们通常要读取和设置文件、文件夹权限。
读取文件、文件夹权限
/// <summary>
/// 读取文件、文件夹权限
/// </summary>
/// <param name="path"></param>
private void readpathrule(string path)
{
directoryinfo di = new directoryinfo(path);
directorysecurity ds = di.getaccesscontrol(accesscontrolsections.all);
foreach (filesystemaccessrule rule in ds.getaccessrules(true, true, typeof(system.security.principal.ntaccount)))
{
console.writeline("----------------------------------");
console.writeline(rule.identityreference.value);
if ((rule.filesystemrights & filesystemrights.read) != 0)
console.writeline(rule.filesystemrights.tostring());
}
}
设置文件权限
/// <summary>
/// 为文件添加users,everyone用户组的完全控制权限
/// </summary>
/// <param name="filepath"></param>
static void addsecuritycontroll2file(string filepath)
{
//获取文件信息
fileinfo fileinfo = new fileinfo(filepath);
//获得该文件的访问权限
system.security.accesscontrol.filesecurity filesecurity = fileinfo.getaccesscontrol();
//添加ereryone用户组的访问权限规则 完全控制权限
filesecurity.addaccessrule(new filesystemaccessrule("everyone", filesystemrights.fullcontrol, accesscontroltype.allow));
//添加users用户组的访问权限规则 完全控制权限
filesecurity.addaccessrule(new filesystemaccessrule("users", filesystemrights.fullcontrol, accesscontroltype.allow));
//设置访问权限
fileinfo.setaccesscontrol(filesecurity);
}
设置文件夹权限
/// <summary>
///为文件夹添加users,everyone用户组的完全控制权限
/// </summary>
/// <param name="dirpath"></param>
static void addsecuritycontroll2folder(string dirpath)
{
//获取文件夹信息
directoryinfo dir = new directoryinfo(dirpath);
//获得该文件夹的所有访问权限
system.security.accesscontrol.directorysecurity dirsecurity = dir.getaccesscontrol(accesscontrolsections.all);
//设定文件acl继承
inheritanceflags inherits = inheritanceflags.containerinherit | inheritanceflags.objectinherit;
//添加ereryone用户组的访问权限规则 完全控制权限
filesystemaccessrule everyonefilesystemaccessrule = new filesystemaccessrule("everyone", filesystemrights.fullcontrol, inherits, propagationflags.none, accesscontroltype.allow);
//添加users用户组的访问权限规则 完全控制权限
filesystemaccessrule usersfilesystemaccessrule = new filesystemaccessrule("users", filesystemrights.fullcontrol, inherits, propagationflags.none, accesscontroltype.allow);
bool ismodified = false;
dirsecurity.modifyaccessrule(accesscontrolmodification.add, everyonefilesystemaccessrule, out ismodified);
dirsecurity.modifyaccessrule(accesscontrolmodification.add, usersfilesystemaccessrule, out ismodified);
//设置访问权限
dir.setaccesscontrol(dirsecurity);
}
注意:修改权限有时候需要程序有管理员权限,怎么以管理员身份运行程序,请参考:
c#/wpf 以管理员身份运行程序
在vista 和 windows 7 及更新版本的操作系统,增加了 uac(用户账户控制) 的安全机制,如果 uac 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭uac,但有时我们开发的应用程序又需要以administrator 的方式运行。
解决办法有以下几种方式:
通过 system.diagnostics.process.start() 方式启动(推荐)
通过添加应用程序清单文件(过于暴力,且有提示)
直接修改程序文件的属性(不方便部署)
方法一:通过 system.diagnostics.process.start() 方式启动:
wpf app.xaml代码:
<application x:class="adminloaddemo.app"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:adminloaddemo"
startup="application_startup">
<application.resources>
</application.resources>
</application>
wpf app.xaml.cs代码:
private void application_startup(object sender, startupeventargs e)
{
/**
* 当前用户是管理员的时候,直接启动应用程序
* 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行
*/
//获得当前登录的windows用户标示
system.security.principal.windowsidentity identity = system.security.principal.windowsidentity.getcurrent();
system.security.principal.windowsprincipal principal = new system.security.principal.windowsprincipal(identity);
//判断当前登录用户是否为管理员
if (principal.isinrole(system.security.principal.windowsbuiltinrole.administrator))
{
//如果是管理员,则直接运行
new mainwindow().show();
}
else
{
//创建启动对象
system.diagnostics.processstartinfo startinfo = new system.diagnostics.processstartinfo();
startinfo.useshellexecute = true;
startinfo.workingdirectory = environment.currentdirectory;
startinfo.filename = system.diagnostics.process.getcurrentprocess().mainmodule.filename;
//设置启动动作,确保以管理员身份运行
startinfo.verb = "runas";
try
{
system.diagnostics.process.start(startinfo);
}
catch
{
return;
}
//退出
environment.exit(0);
}
到此这篇关于c#实现读取和设置文件与文件夹的权限的文章就介绍到这了,更多相关c#文件权限内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论