设置权限

【勇芳软件工作室】汉化HomePreviousNext

以下示例从文件中删除自由ACL。如有必要,该文件的所有权将被授予管理员帐户。如果需要,该帐户将启用SE_TAKE_OWNERSHIP_NAME特权。

LPSTR lpszOwnFile = "d:\\ntfs_sample_file";

PSID pSIDAliasAdmins = NULL;

静态SID_IDENTIFIER_AUTHORITY

siaNTAuthority = SECURITY_NT_AUTHORITY;

BOOL FAR PASCAL TakeOwnership()

{

SECURITY_DESCRIPTOR sd;

/*

*初始化一个安全描述符并赋值一个NULL

*自由ACL允许无限制访问。

*将安全描述符分配给文件。

*/

if(!InitializeSecurityDescriptor(& sd,

SECURITY_DESCRIPTOR_REVISION)) {

ErrorHandler("InitializeSecurityDescriptor");

return FALSE;

}

if(!SetSecurityDescriptorDacl(& sd,

TRUE,

(PACL) NULL,

FALSE)) {

ErrorHandler("SetSecurityDescriptorDacl");

return FALSE;

}

如果(SetFileSecurity(lpszOwnFile,id

DACL_SECURITY_INFORMATION,

&sd))

return TRUE;

其他

ErrorHandler("SetFileSecurity1");

/*

*如果上述调用SetFileSecurity失败,请创建

*管理员SID并使用它来设置所有者

*安全描述符。

*/

如果(!AllocateAndInitializeSid( siaNTAuthority,

2,/ * subauthority count * /

/ *第一次授权* /

SECURITY_BUILTIN_DOMAIN_RID,

/ *第二次次授权* /

DOMAIN_ALIAS_RID_ADMINS,

0, 0, 0, 0, 0, 0,

{} PSIDAliasAdmins 989796005)){

ErrorHandler("AllocateAndInitializeSid");

return FALSE;

}

if(!SetSecurityDescriptorOwner(& sd,

pSIDAliasAdmins,

FALSE)) {

ErrorHandler("SetSecurityDescriptorOwner");

FreeSid(pSIDAliasAdmins);

return FALSE;

}

/*

*如果以下调用SetFileSecurity失败,

*在访问令牌中启用SE_TAKE_OWNERSHIP_NAME

*当前进程,再试一次。

*/

如果(!SetFileSecurity(lpszOwnFile,id

OWNER_SECURITY_INFORMATION,

&sd)) {

ErrorHandler("SetFileSecurity2");

if(!AssertTakeOwnership(TRUE)){/ * local * /

MessageBox(NULL,“必须以管理员身份登录”,

"AssertTakeOwnership", MB_OK);

FreeSid(pSIDAliasAdmins);

return FALSE;

}

如果(!SetFileSecurity(lpszOwnFile,id

OWNER_SECURITY_INFORMATION,

&sd)) {

MessageBox(NULL,“必须以管理员身份登录”,

"SetFileSecurity", MB_OK);

FreeSid(pSIDAliasAdmins);

return FALSE;

}

}

/*

*管理员现在是该文件的所有者。

*再次尝试分配NULL ACL。

*/

如果(SetFileSecurity(lpszOwnFile,id

DACL_SECURITY_INFORMATION,

&sd)) {

MessageBox(NULL, "Added NULL DACL; protection removed",

"SetFileSecurity", MB_OK);

AssertTakeOwnership(FALSE);

return TRUE;

}

else {

AssertTakeOwnership(FALSE);

ErrorHandler("SetFileSecurity3");

return FALSE;

}

}

BOOL FAR PASCAL AssertTakeOwnership(BOOL fEnable)

{

HANDLE hToken;

LUID TakeOwnershipValue;

TOKEN_PRIVILEGES tkp;

/ *检索访问令牌的句柄。*/

if(!OpenProcessToken(GetCurrentProcess(),en

TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,

& hToken)){

ErrorHandler("OpenProcessToken");

return FALSE;

}

/*

*启用SE_TAKE_OWNERSHIP_NAME特权或

*禁用所有权限,具体取决于fEnable

*标志。

*/

if(fEnable){

if(!LookupPrivilegeValue((LPSTR)NULL,

SE_TAKE_OWNERSHIP_NAME,

& TakeOwnershipValue)){

ErrorHandler("LookupPrivilegeValue");

return FALSE;

}

tkp.PrivilegeCount = 1;

tkp.Privileges[0].Luid = TakeOwnershipValue;

tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken,

FALSE,

{} 989796005现场,

sizeof(TOKEN_PRIVILEGES),

(PTOKEN_PRIVILEGES) NULL,

(PDWORD) NULL);

/*

* AdjustTokenPrivileges的返回值不能

*进行测试。

*/

if (GetLastError() != ERROR_SUCCESS) {

ErrorHandler("AdjustTokenPrivileges");

return FALSE;

}

}

else {

AdjustTokenPrivileges(hToken,

TRUE,/ *禁用所有权限* /

(PTOKEN_PRIVILEGES) NULL,

(DWORD) 0,

(PTOKEN_PRIVILEGES) NULL,

(PDWORD) NULL);

/*

* AdjustTokenPrivileges的返回值不能

*进行测试。

*/

if (GetLastError() != ERROR_SUCCESS) {

ErrorHandler("AdjustTokenPrivileges");

return FALSE;

}

}

return TRUE;

}