zoukankan      html  css  js  c++  java
  • 修改文件(夹)的用户访问权限的程序代码

    原文链接: http://www.cppblog.com/wrhwww/archive/2011/08/23/154117.html

    一般Windows下的系统文件(夹)只让受限帐户读取而不让写入和修改。如果要开启写操作权限就需要手动修改文件(夹)的用户帐户安全权限(这操作当然要在管理员帐户下执行).以下用程序封装了一下该操作:

      先来个API版本:

      //

      // 启用某个账户对某个文件(夹)的所有操作权限

      // pszPath: 文件(夹)路径

      // pszAccount: 账户名称

      //

      BOOL  EnableFileAccountPrivilege (PCTSTR pszPath, PCTSTR pszAccount)

      {

      BOOL bSuccess = TRUE;

      PACL pNewDacl = NULL, pOldDacl = NULL;

      EXPLICIT_ACCESS ea;

      do

      {

      // 获取文件(夹)安全对象的DACL列表

      if (ERROR_SUCCESS != ::GetNamedSecurityInfo ((LPTSTR)pszPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDacl, NULL, NULL))

      {

      bSuccess  =  FALSE;

      break;

      }

      // 此处不可直接用AddAccessAllowedAce函数,因为已有的DACL长度是固定,必须重新创建一个DACL对象

      // 生成指定用户帐户的访问控制信息(这里指定赋予全部的访问权限)

      ::BuildExplicitAccessWithName (&ea, (LPTSTR)pszAccount, GENERIC_ALL, GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);

      // 创建新的ACL对象(合并已有的ACL对象和刚生成的用户帐户访问控制信息)

      if (ERROR_SUCCESS != ::SetEntriesInAcl(1, &ea, pOldDacl, &pNewDacl))

      {

      bSuccess   =  FALSE;

      break;

      }

      // 设置文件(夹)安全对象的DACL列表

      if (ERROR_SUCCESS != ::SetNamedSecurityInfo ((LPTSTR)pszPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDacl, NULL))

      {

      bSuccess   =  FALSE;

      }

      } while (FALSE);

      // 释放资源

      if (pNewDacl != NULL)

      ::LocalFree(pNewDacl);

      return bSuccess;

      }

          ATL封装了安全操作函数,用ATL来写就简单多了:

          //

      // 启用某个账户对某个文件(夹)的所有操作权限(ATL版本)

      // pszPath: 文件(夹)路径

      // pszAccount: 账户名称

      //

      BOOL  AtlEnableFileAccountPrivilege (PCTSTR pszPath, PCTSTR pszAccount)

      {

      CDacl  dacl;

      CSid   sid;

      // 获取用户帐户标志符

      if (!sid.LoadAccount (pszAccount))

      {

      return FALSE;

      }

      // 获取文件(夹)的DACL

      if (!AtlGetDacl (pszPath, SE_FILE_OBJECT, &dacl))

      {

      return FALSE;

      }

      // 在DACL中添加新的ACE项

      dacl.AddAllowedAce (sid, GENERIC_ALL);

      // 设置文件(夹)的DACL

      return AtlSetDacl (pszPath, SE_FILE_OBJECT, dacl) ? TRUE : FALSE;

      }

  • 相关阅读:
    2015 Multi-University Training Contest 5 1007
    2015 Multi-University Training Contest 5 1002
    ZOJ 3261 Connections in Galaxy War (并查集)
    POJ 2492 A Bug's Life (并查集)
    POJ 1733 Parity game (离散化+带权并查集)
    HDU 3172 Virtual Friends (并查集节点统计)
    HDU 2473 Junk-Mail Filter (并查集节点删除)
    hdu3047 Zjnu Stadium && HDU 3038 How Many Answers Are Wrong (带权并查集)
    HDU 1272 小希的迷宫
    poj 3620 Avoid The Lakes(dfs)
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4595650.html
Copyright © 2011-2022 走看看