На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Setting Privileges



The following example removes the discretionary ACL from a file. If necessary, ownership of the file is given to the Administrator account. If required, the SE_TAKE_OWNERSHIP_NAME privilege is enabled for the account.

LPSTR lpszOwnFile = "d:\\ntfs_sample_file";
PSID pSIDAliasAdmins = NULL;

static SID_IDENTIFIER_AUTHORITY
siaNTAuthority = SECURITY_NT_AUTHORITY;

BOOL FAR PASCAL TakeOwnership()
{
SECURITY_DESCRIPTOR sd;

/*
* Initialize a security descriptor and assign it a NULL
* discretionary ACL to allow unrestricted access.
* Assign the security descriptor to a file.
*/

if (!InitializeSecurityDescriptor(&sd,
SECURITY_DESCRIPTOR_REVISION)) {

ErrorHandler("InitializeSecurityDescriptor");
return FALSE;
}

if (!SetSecurityDescriptorDacl(&sd,
TRUE,
(PACL) NULL,
FALSE)) {
ErrorHandler("SetSecurityDescriptorDacl");
return FALSE;
}

if (SetFileSecurity(lpszOwnFile,
DACL_SECURITY_INFORMATION,
&sd))
return TRUE;
else
ErrorHandler("SetFileSecurity1");

/*

* If the preceding call to SetFileSecurity fails, create
* an Administrator SID and use it to set the owner of
* the security descriptor.
*/

if (!AllocateAndInitializeSid(&siaNTAuthority,
2, /* subauthority count */
/* first subauthority */
SECURITY_BUILTIN_DOMAIN_RID,
/* second subauthority */
DOMAIN_ALIAS_RID_ADMINS,

0, 0, 0, 0, 0, 0,
&pSIDAliasAdmins)) {
ErrorHandler("AllocateAndInitializeSid");
return FALSE;
}

if (!SetSecurityDescriptorOwner(&sd,
pSIDAliasAdmins,
FALSE)) {
ErrorHandler("SetSecurityDescriptorOwner");
FreeSid(pSIDAliasAdmins);
return FALSE;
}

/*
* If the following call to SetFileSecurity fails,
* enable SE_TAKE_OWNERSHIP_NAME in the access token for

* the current process and try again.
*/

if (!SetFileSecurity(lpszOwnFile,
OWNER_SECURITY_INFORMATION,
&sd)) {
ErrorHandler("SetFileSecurity2");
if (!AssertTakeOwnership(TRUE)) { /* local */
MessageBox(NULL, "Must be logged on as Administrator",
"AssertTakeOwnership", MB_OK);
FreeSid(pSIDAliasAdmins);
return FALSE;
}
if (!SetFileSecurity(lpszOwnFile,

OWNER_SECURITY_INFORMATION,
&sd)) {
MessageBox(NULL, "Must be logged on as Administrator",
"SetFileSecurity", MB_OK);
FreeSid(pSIDAliasAdmins);
return FALSE;
}
}

/*
* The Administrator is now the owner of the file.
* Try again to assign a NULL ACL.
*/

if (SetFileSecurity(lpszOwnFile,
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;

/* Retrieve a handle of the access token. */


if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken)) {
ErrorHandler("OpenProcessToken");
return FALSE;
}

/*
* Enable the SE_TAKE_OWNERSHIP_NAME privilege or
* disable all privileges, depending on the fEnable
* flag.
*/

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,
&tkp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL);

/*
* The return value of AdjustTokenPrivileges cannot

* be tested.
*/

if (GetLastError() != ERROR_SUCCESS) {
ErrorHandler("AdjustTokenPrivileges");
return FALSE;
}
}
else {
AdjustTokenPrivileges(hToken,
TRUE, /* disable all privileges */
(PTOKEN_PRIVILEGES) NULL,
(DWORD) 0,
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL);

/*
* The return value of AdjustTokenPrivileges cannot

* be tested.
*/

if (GetLastError() != ERROR_SUCCESS) {
ErrorHandler("AdjustTokenPrivileges");
return FALSE;
}
}

return TRUE;
}



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Установка Привилегий



Следующий пример удаляет дискреционный ACL из файла. Если необходимо, собственность на файл дана счету Администратора. Если потребовалось, привилегия SE_TAKE_OWNERSHIP_NAME приспособлена за счет.

LPSTR lpszOwnFile = "d:\\ntfs_sample_file";
PSID pSIDAliasAdmins = НЕДЕЙСТВИТЕЛЬНЫЙ;

статический siaNTAuthority = SID_IDENTIFIER_AUTHORITY SECURITY_NT_AUTHORITY;

BOOL ЗНАЧИТЕЛЬНО PASCAL TakeOwnership()
{
sd SECURITY_DESCRIPTOR;

/*
* Инициализируйте дескриптор безопасности и назначайте это НЕДЕЙСТВИТЕЛЬНЫЙ
* дискреционный ACL, чтобы допускать неограниченный доступ.
* Назначьте дескриптор безопасности в файл.
*/

если (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)) {

ErrorHandler("InitializeSecurityDescriptor");
обратная ЛОЖЬ;
}

если (!SetSecurityDescriptorDacl(&sd, ИСТИНА, (PACL) НЕДЕЙСТВИТЕЛЬНЫЙ, ЛОЖНЫЙ)) { ErrorHandler("SetSecurityDescriptorDacl");
обратная ЛОЖЬ;
}

если (SetFileSecurity(lpszOwnFile, DACL_SECURITY_INFORMATION, &sd)) обратная ИСТИНА;
еще
ErrorHandler("SetFileSecurity1");

/*

* Если предыдущий вызов на SetFileSecurity терпит неудачу, создайтесь
* Администратор SID и использование это, чтобы устанавливать владельца
* дескриптор безопасности.
*/

если (!AllocateAndInitializeSid(&siaNTAuthority, 2, /* СЧЕТ subauthority */ /* первый subauthority */ SECURITY_BUILTIN_DOMAIN_RID, /* subauthority секунды */ DOMAIN_ALIAS_RID_ADMINS,

0, 0, 0, 0, 0, 0,
&pSIDAliasAdmins)) { ErrorHandler("AllocateAndInitializeSid");
обратная ЛОЖЬ;
}

если (!SetSecurityDescriptorOwner(&sd, pSIDAliasAdmins, ЛОЖЬ)) { ErrorHandler("SetSecurityDescriptorOwner");
FreeSid(pSIDAliasAdmins);
обратная ЛОЖЬ;
}

/*
* Если следующее вызова на SetFileSecurity терпит неудачу,
* приспособьтесь SE_TAKE_OWNERSHIP_NAME в признаке доступа для

* текущий процесс и попытка снова.
*/

если (!SetFileSecurity(lpszOwnFile, OWNER_SECURITY_INFORMATION, &sd)) { ErrorHandler("SetFileSecurity2");
если (!AssertTakeOwnership(ИСТИНА)) { /* локальный */ MessageBox(НЕДЕЙСТВИТЕЛЬНЫЙ, "Должно регистрироваться на как Администратор", "AssertTakeOwnership", MB_OK);
FreeSid(pSIDAliasAdmins);
обратная ЛОЖЬ;
}
если (!SetFileSecurity(lpszOwnFile,

OWNER_SECURITY_INFORMATION, &sd)) {
MessageBox(НЕДЕЙСТВИТЕЛЬНЫЙ, "Должно регистрироваться на как Администратор", "SetFileSecurity", MB_OK);
FreeSid(pSIDAliasAdmins);
обратная ЛОЖЬ;
}
}

/*
* Администратор является теперь владельцем файла.
* Попытка снова, чтобы назначать НЕДЕЙСТВИТЕЛЬНЫЙ ACL.
*/

если (SetFileSecurity(lpszOwnFile, DACL_SECURITY_INFORMATION,

&sd)) {
MessageBox(НЕДЕЙСТВИТЕЛЬНЫЙ, "Добавившее NULL DACL; защита удаляла", "SetFileSecurity", MB_OK);
AssertTakeOwnership(ЛОЖЬ);
возвращайтесь ВЕРНО;
}

еще {
AssertTakeOwnership(ЛОЖЬ);
ErrorHandler("SetFileSecurity3");
обратная ЛОЖЬ;
}
}

BOOL ЗНАЧИТЕЛЬНО PASCAL AssertTakeOwnership(BOOL fEnable)
{
ПРООПЕРИРУЙТЕ hToken;
LUID TakeOwnershipValue;
tkp TOKEN_PRIVILEGES;

/* Извлеките ручку доступа token. */


если (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { ErrorHandler("OpenProcessToken");
обратная ЛОЖЬ;
}

/*
* Приспособьтесь привилегию SE_TAKE_OWNERSHIP_NAME или
* выведите из строя все привилегии, в зависимости от fEnable
* флаг.
*/

если(fEnable) {
если (!LookupPrivilegeValue((LPSTR) НЕДЕЙСТВИТЕЛЬНЫЙ, SE_TAKE_OWNERSHIP_NAME, &TakeOwnershipValue)) {

ErrorHandler("LookupPrivilegeValue");
обратная ЛОЖЬ;
}

tkp.PrivilegeCount = 1;
tkp.Привилегии[0].Luid = TakeOwnershipValue;
tkp.Привилегии[0].Приписывает = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) НЕДЕЙСТВИТЕЛЬНЫЙ, (PDWORD) НЕДЕЙСТВИТЕЛЬНЫЙ);

/*
* Обратная величина AdjustTokenPrivileges не может

* протестирован.
*/

если (GetLastError() != ERROR_SUCCESS) { ErrorHandler("AdjustTokenPrivileges");
обратная ЛОЖЬ;
}
}
еще {
AdjustTokenPrivileges(hToken, TRUE, /* выведите из строя все привилегии */ (PTOKEN_PRIVILEGES) НЕДЕЙСТВИТЕЛЬНЫЙ, (DWORD) 0, (PTOKEN_PRIVILEGES) НЕДЕЙСТВИТЕЛЬНЫЙ, (PDWORD) НЕДЕЙСТВИТЕЛЬНЫЙ);

/*
* Обратная величина AdjustTokenPrivileges не может

* протестирован.
*/

если (GetLastError() != ERROR_SUCCESS) { ErrorHandler("AdjustTokenPrivileges");
обратная ЛОЖЬ;
}
}

возвращайтесь ВЕРНО;
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz