修改文件的所有者和访问权限

 

原文链接: http://www.pfmboy.com/post/100.html

下面代码修改文件的所有者为当前用户并添加everyone完全控制权限。注意一定要先设置一下所有者(owner),然后再进行权限设置,二者一起执行是不会成功的。

 

BOOL AdjustPrivileges(LPWSTR lpName)
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tp = {0};
TOKEN_PRIVILEGES oldtp = {0};
DWORD dwSize = sizeof(TOKEN_PRIVILEGES);
LUID luid = {0};

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
return TRUE;
else
return FALSE;
}
if (!LookupPrivilegeValueW(NULL, lpName, &luid)) {
CloseHandle(hToken);
return FALSE;
}

tp.PrivilegeCount=1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

/* Adjust Token Privileges */
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
CloseHandle(hToken);
return FALSE;
}

// close handles
CloseHandle(hToken);
return TRUE;
}

 

BOOL TakeOwner(char *FilePath)
{
CHAR UserName[36];
DWORD cbUserName = sizeof(UserName);
CHAR Sid[1024] = {0};
DWORD cbSid = sizeof(Sid);
CHAR DomainBuffer[128] = {0};
DWORD cbDomainBuffer = sizeof(DomainBuffer);
SID_NAME_USE eUse;
PACL Dacl = NULL,OldDacl = NULL;
EXPLICIT_ACCESS Ea;
PSECURITY_DESCRIPTOR Sd = NULL;
BOOL Ret = FALSE;

if (AdjustPrivileges(SE_TAKE_OWNERSHIP_NAME) && AdjustPrivileges(SE_RESTORE_NAME))
{
GetUserNameA(UserName,&cbUserName);
if (LookupAccountNameA(NULL,UserName,&Sid,&cbSid,DomainBuffer,&cbDomainBuffer,&eUse))
{

ZeroMemory(&Ea,sizeof(EXPLICIT_ACCESS));
GetNamedSecurityInfoA(FilePath,SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,NULL, NULL, &OldDacl, NULL, &Sd);
BuildExplicitAccessWithNameW(&Ea,L"everyone",GENERIC_ALL,GRANT_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT);
if (SetEntriesInAclW(1,&Ea,OldDacl,&Dacl) == ERROR_SUCCESS)
{
SetNamedSecurityInfoA(FilePath,SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION ,&Sid,NULL,NULL,NULL);
if (SetNamedSecurityInfoA(FilePath,SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,&Sid,NULL,Dacl,NULL) == ERROR_SUCCESS)
{
Ret = TRUE;
}
}

}
}
return Ret;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值