一般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 |
寫
|