windows用户类型:administrator、guest、自定义用户等;文件的权限不外乎:read、write、modify、remove等等,其中拥有所有权限的字符叫做fullcontrol。

c#当前程序用户路径权限验证

/// <summary>
  /// 是否拥有程序数据路径权限
  /// </summary>
  private static bool hasprogramdatarights=false;
 
  public static bool isadministrator()
  {
   system.security.principal.windowsidentity identity = system.security.principal.windowsidentity.getcurrent();
   system.security.principal.windowsprincipal principal = new system.security.principal.windowsprincipal(identity);
   return principal.isinrole(system.security.principal.windowsbuiltinrole.administrator);
  }
 
  /// <summary>
  /// 读取系统程序数据路径权限&判断是否可以使用临时目录进行保存操作
  /// </summary>
  /// <param name="path"></param>
  public void readprogramdatarights(string path)
  {
   // 通过判定文件的权限来控制路径
   system.security.accesscontrol.directorysecurity dirsec = new system.io.directoryinfo(path).getaccesscontrol();
   system.security.accesscontrol.authorizationrulecollection rules = dirsec.getaccessrules(true, true, typeof(system.security.principal.ntaccount));
   foreach (system.security.accesscontrol.filesystemaccessrule rule in rules)
   {
    console.writeline(path + "文件目录权限字符:" + rule.filesystemrights);
    // 判定文件是否具有fullcontrol或write权限
    if (rule.filesystemrights.tostring().equals("fullcontrol") || rule.filesystemrights.tostring().equals("write"))
    {
     hasprogramdatarights = true;
     break;
    }
   }
   // 为ie保护模式创建临时保存路径
   if (hasprogramdatarights)
   {
    // 创建操作路径
    string recordtemp = filehelp.getappdatalocallow() + "\\cvnetvideo\\record\\";
    string screenshottemp = filehelp.getappdatalocallow() + "\\cvnetvideo\\screenshot\\";
    string recorddst = filehelp.getcommonapplicationdata() + "\\cvnetvideo\\record\\";
    string screenshotdst = filehelp.getcommonapplicationdata() + "\\cvnetvideo\\screenshot\\";
    directory.createdirectory(recordtemp);
    directory.createdirectory(screenshottemp);
    directory.createdirectory(recorddst);
    directory.createdirectory(screenshotdst);
   }
  }

c#文件操作工具类

public class filehelp
 {
  public enum getdirectorytype
  {
   byappdomain,
   byassembly
  }
  public static string getcurrentdirectory(getdirectorytype type = getdirectorytype.byappdomain)
  {
   switch (type)
   {
    case getdirectorytype.byappdomain:
     return appdomain.currentdomain.basedirectory;
    case getdirectorytype.byassembly:
 
     return path.getdirectoryname(system.reflection.assembly.getexecutingassembly().location);
    default:
     return appdomain.currentdomain.basedirectory;
   }
  }
  public static string getcurrentdirectorybyassembly()
  {
   return getcurrentdirectory(getdirectorytype.byassembly);
  }
 
  /// <summary>
  ///程序数据路径- c:\programdata
  /// </summary>
  /// <returns></returns>
  public static string getcommonapplicationdata()
  {
   return environment.getfolderpath(environment.specialfolder.commonapplicationdata);
  }
 
  /// <summary>
  /// 用户数据路径
  /// </summary>
  /// <returns></returns>
  public static string getapplicationdata()
  {
   return environment.getfolderpath(environment.specialfolder.applicationdata);
  }
 
  /// <summary>
  /// 用户数据本地路径
  /// </summary>
  /// <returns></returns>
  public static string getlocalapplicationdata()
  {
   return environment.getfolderpath(environment.specialfolder.localapplicationdata);
  }
 
  /// <summary>
  /// 用户路径
  /// </summary>
  /// <returns></returns>
  public static string getuserprofile()
  {
   return environment.getfolderpath(environment.specialfolder.userprofile);
  }
 
  /// <summary>
  /// 用户的图片路径
  /// </summary>
  /// <returns></returns>
  public static string getmypictures()
  {
   return environment.getfolderpath(environment.specialfolder.mypictures);
  }
 
  /// <summary>
  /// 用户的视频路径
  /// </summary>
  /// <returns></returns>
  public static string getmyvideos()
  {
   return environment.getfolderpath(environment.specialfolder.myvideos);
  }
 
  /// <summary>
  /// 用户的文档路径
  /// </summary>
  /// <returns></returns>
  public static string getmydocuments()
  {
   return environment.getfolderpath(environment.specialfolder.mydocuments);
  }
 
  /// <summary>
  /// ie保护模式下的低权限操作路径(temporary internet files/low)
  /// </summary>
  /// <returns></returns>
  public static string gettemporaryinternetfiles()
  {
   return getlocalapplicationdata()+ "\\microsoft\\windows\\temporary internet files\\low";
  } 
  /// <summary>
  /// ie保护模式下的低权限操作路径(%userprofile%/appdata/locallow)
  /// </summary>
  /// <returns></returns>
  public static string getappdatalocallow()
  {
   return getuserprofile() + "\\appdata\\locallow";
  }
 
  /// <summary>
  /// 获取系统字体文件路径
  /// </summary>
  /// <returns></returns>
  public static string getfonts()
  {
   return environment.getfolderpath(environment.specialfolder.fonts);
  } 
  /// <summary>
  /// 二进制文件读取
  /// </summary>
  /// <param name="fileurl">文件路径</param>
  /// <returns></returns>
  public static byte[] binaryread(string fileurl)
  {
   list<byte> lst = new list<byte>();
   try
   {
    //文件路径
    string filename = fileurl;
    //打开文件
    filestream fstream;
    if (file.exists(filename))
    {
     fstream = new filestream(filename, filemode.open);
    }
    else
    {
     return null;
    }
    int buffersize = 1048576; //每次读取的字节数 每次读取1mb
    byte[] buffer = new byte[buffersize];
    long filelength = fstream.length;//文件流的长度
    int readcount = (int)(filelength / buffersize) + 1; //需要对文件读取的次数
                 //数据读取
    binaryreader bwrite = new binaryreader(fstream);
    //br.basestream.seek(0, seekorigin.begin);
    //while (br.basestream.position < br.basestream.length){}
    for (int a = 0; a < readcount; a++)
    {
     buffer = bwrite.readbytes(buffersize);
     lst.addrange(buffer);
    }
    bwrite.close();
    bwrite.close();
    return lst.toarray();
   }
   catch (system.exception ex)
   {
    log.writelog4ex("filehelp.binaryread", ex);
    return null;
   }
  } 
  /// <summary>
  /// 二进制文件写入
  /// </summary>
  /// <param name="bts"></param>
  /// <param name="directoryurl">文件目录路径</param>
  /// <param name="filename">文件名称</param>
  /// <returns></returns>
  public static bool binarywrite(byte[] bts, string directoryurl, string filename)
  {
   try
   {
    //文件路径
    string filepath = directoryurl + "\\" + filename;
    //目录创建
    if (!directory.exists(directoryurl))
     directory.createdirectory(directoryurl);
    //文件创建
    filestream fstream;
    if (file.exists(filepath))
    {
     fstream = new filestream(filepath, filemode.append);
    }
    else
    {
     fstream = new filestream(filepath, filemode.create);
    }
    //数据写入
    binarywriter bwrite = new binarywriter(fstream);
    bwrite.write(bts);
    bwrite.close();
    fstream.close();
    return true;
   }
   catch (system.exception ex)
   {
    log.writelog4ex("filehelp.binarywrite", ex);
    return false;
   }
  } 
  /// <summary>
  /// 二进制文件删除
  /// </summary>
  /// <param name="fileurl">文件路径</param>
  public static void filedelete(string fileurl)
  {
   try
   {
    //文件路径
    string filename = fileurl;
    //删除文件
    if (file.exists(filename))
    {
     file.delete(filename);
    }
   }
   catch (system.exception ex)
   {
    log.writelog4ex("filehelp.filedelete", ex);
   }
  }
 }

注:如果您是开发ocx遇到路径问题请使用工具类中ie保护模式下的低权限路径。

补充知识:c#修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限

写在前面

在windows系统中,c盘中的目录权限比较高,有时制作安装包的时候,默认的安装路径就是在c盘,但对运行可执行文件,有时候需要为其添加完全控制权限,或者读写权限。这里将当时的解决方案记录一下。

代码实现

在c盘添加一个文件夹,并在文件夹内部,新建一个文本文件,如图所示:

该文件夹下,新建一个文本文件,如图所示:

为文件添加完全控制权限:

/// <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#程序验证系统登录用户与目录权限就是www.887551.com分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持www.887551.com。