#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 对象
// 生成指定用户帐户的访问控制信息(这里指定赋予全部的访问权限,
GRANT_ACCESS(授予访问)
SET_ACCESS (设置访问)
DENY_ACCESS(拒绝访问)
REVOKE_ACCESS(撤销访问))
::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;
}