一般Windows下的系统文件(夹)只让受限帐户读取而不让写入和修改。如果要开启写操作权限就需要手动修改文件(夹)的用户帐户安全权限(这操作当然要在管理员帐户下执行).以下用程序封装了一下该操作:
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #include <AccCtrl.h> #include <AclAPI.h> int EnableFileAccountPrivilege (PCTSTR pszPath, PCTSTR pszAccount) { BOOL bSuccess = TRUE; EXPLICIT_ACCESS ea; PACL pNewDacl = NULL; PACL pOldDacl = NULL; 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 (NULL != pNewDacl) { ::LocalFree(pNewDacl); } return bSuccess; } int _tmain(int argc, _TCHAR* argv[]) { // 获取当前登录用户的名称 wchar_t strBuffer[256] ={0}; DWORD dwSize = 256; GetUserName(strBuffer,&dwSize); const wchar_t z_wszPath[MAX_PATH] = L"H:\test2"; const wchar_t z_wszAccountName[MAX_PATH] = L"Users"; if (!EnableFileAccountPrivilege(z_wszPath, z_wszAccountName)) { printf("change file account Privilege fail : %s", "H:\test1"); } //int z_Flag = GetFileAttributes(L"H:\test"); //if (!(z_Flag&FILE_ATTRIBUTE_DIRECTORY)) //{ // return 0; //} // //if (z_Flag&FILE_ATTRIBUTE_READONLY) //{ // printf("wangjian"); //} //SetFileAttributes(L"H:\test", FILE_ATTRIBUTE_NORMAL); return 0; }
通用访问权限
安全对象使用Windows 访问掩码格式,四个高位说明通用访问权限。每个安全对象类型映射到这些位到一系列标准和对象特殊访问权限。例如:一个Window文件对象映射GENERIC_READ位到READ_CONTROL和SYNCHRONIZE 标准访问权限和FILE_READ_DATA、FILE_READ_EA和FILE_READ_ATTRIBUTES对象指定访问权限。其他类型对象映射GENERIC_READ位到与类型对象适应的一些访问权限。
你可以在你打开一个对象句柄的时候使用通用访问权限来指定需要的访问类型;这通常比指定所有对应标准和特指权限要简单。
下表显示了通用访问权限定义的常量。
常量 |
解释 |
GENERIC_ALL |
读、写和执行访问 |
GENERIC_EXECUTE |
执行 |
GENERIC_READ |
读 |
GENERIC_WRITE |
写 |