標籤:readonly 指定 bsp 修改檔案 gpo 類型 sharp cts size
一般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 |
寫 |
windows c++ 修改使用者的檔案夾操作許可權