На главную

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 | Скачать Вниз

Allowing Access Using the Low-Level Functions



This topic shows how to use the low-level functions to work with ACLs and ACEs that allow access to an object. For similar examples that use the high-level security functions, see Allowing Access.

The first example shows the use of the low-level access-control functions to add a NULL DACL to a file's security descriptor. The low-level example allocates a security descriptor buffer and calls the InitializeSecurityDescriptor function to initialize it. Then it calls the SetSecurityDescriptorDacl function to attach a NULL DACL to the security descriptor. Finally, it calls the SetFileSecurity function to attach the security descriptor to a file. An equivalent high-level example could perform the same operation with a single call to the SetNamedSecurityInfo function.



Note You can write code that builds security descriptors from scratch, as in the example. However, when writing code that builds or manipulates security descriptors, your code should explore the default security descriptors that Windows NT places on objects. For example, an object may have a default DACL that contains ACEs inherited from its parent object. Rather than simply replacing the default DACL, your code should first examine the default DACL to determine whether you want to include its ACEs in the new DACL.



PSECURITY_DESCRIPTOR pSD;

/* Initialize a security descriptor. */

pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH); /* defined in WINNT.H */
if (pSD == NULL) {
ErrorHandler("LocalAlloc");
goto Cleanup;
}

if (!InitializeSecurityDescriptor(pSD,
SECURITY_DESCRIPTOR_REVISION)) { /* defined in WINNT.H */
ErrorHandler("InitializeSecurityDescriptor");
goto Cleanup;
}

/* Add a NULL disc. ACL to the security descriptor. */


if (!SetSecurityDescriptorDacl(pSD,
TRUE, /* specifying a disc. ACL */
(PACL) NULL,
FALSE)) { /* not a default disc. ACL */
ErrorHandler("SetSecurityDescriptorDacl");
goto Cleanup;
}

/* Add the security descriptor to the file. */

if (!SetFileSecurity(lpszTestFile,
DACL_SECURITY_INFORMATION,
pSD)) {
ErrorHandler("SetFileSecurity");
goto Cleanup;
}

Cleanup:
if(pSD != NULL)

LocalFree((HLOCAL) pSD);


The following example shows the use of the low-level access-control functions to add a DACL with an access-allowed ACE to a file's security descriptor. The example allocates and initializes a security descriptor, allocates and initializes an ACL, and allocates and looks up a security identifier (SID) for a specified account. Then it adds an ACE to the ACL, adds the ACL as the DACL of the security descriptor, and finally, attaches the security descriptor to the file. Note that the high-level functions perform many of these steps for you.

PSECURITY_DESCRIPTOR pSD;
PACL pACLNew;
DWORD cbACL = 1024;
PSID pSID;
DWORD cbSID = 1024;
LPSTR lpszAccount = "UserABC";
LPSTR lpszDomain;
DWORD cchDomainName = 80;
PSID_NAME_USE psnuType;

/* Initialize a new security descriptor. */

pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH); /* defined in WINNT.H */
if (pSD == NULL) {
ErrorHandler("LocalAlloc");

goto Cleanup;
}

if (!InitializeSecurityDescriptor(pSD,
SECURITY_DESCRIPTOR_REVISION)) {
ErrorHandler("InitializeSecurityDescriptor");
goto Cleanup;
}

/* Initialize a new ACL. */

pACLNew = (PACL) LocalAlloc(LPTR, cbACL);
if (pACLNew == NULL) {
ErrorHandler("LocalAlloc");
goto Cleanup;
}

if (!InitializeAcl(pACLNew, cbACL, ACL_REVISION2)) {

ErrorHandler("InitializeAcl");
goto Cleanup;
}

/* Retrieve the SID for UserABC. */

pSID = (PSID) LocalAlloc(LPTR, cbSID);
psnuType = (PSID_NAME_USE) LocalAlloc(LPTR, 1024);
lpszDomain = (LPSTR) LocalAlloc(LPTR, cchDomainName);
if (pSID == NULL || psnuType == NULL ||
lpszDomain == NULL) {
ErrorHandler("LocalAlloc");
goto Cleanup;
}

if (!LookupAccountName((LPSTR) NULL, /* local name */

lpszAccount,
pSID,
&cbSID,
lpszDomain,
&cchDomainName,
psnuType)) {
ErrorHandler("LookupAccountName");
goto Cleanup;
}
if (!IsValidSid(pSID))
TextOut(hdc, 10, yIncrement += 18,
"SID is not valid.", 17);
else
TextOut(hdc, 10, yIncrement += 18,
"SID is valid.", 13);


/* Allow read but not write access to the file. */


if (!AddAccessAllowedAce(pACLNew,
ACL_REVISION2,
GENERIC_READ,
pSID)) {
ErrorHandler("AddAccessAllowedAce");
goto Cleanup;
}

/* Add a new ACL to the security descriptor. */

if (!SetSecurityDescriptorDacl(pSD,
TRUE, /* fDaclPresent flag */
pACLNew,
FALSE)) { /* not a default disc. ACL */
ErrorHandler("SetSecurityDescriptorDacl");

goto Cleanup;
}

/* Apply the new security descriptor to the file. */

if (!SetFileSecurity("d:\\ntfs_sample_file",
DACL_SECURITY_INFORMATION,
pSD)) {
ErrorHandler("SetFileSecurity");
goto Cleanup;
}
TextOut(hdc, 10, yIncrement += 18,
"Successfully added access-allowed ACE to file's DACL.", 53);

Cleanup:
FreeSid(pSID);
if(pSD != NULL)
LocalFree((HLOCAL) pSD);

if(pACLNew != NULL)
LocalFree((HLOCAL) pACLNew);
if(psnuType != NULL)
LocalFree((HLOCAL) psnuType);
if(lpszDomain != NULL)
LocalFree((HLOCAL) lpszDomain);



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

Допускающий Доступ, использовавший Функции Low-Level



Эта тема показывает как, чтобы использовать функции низкого уровня, чтобы работать с ACLs и ПЕР.ТОК, что допускать доступ к объекту. Для аналогичных примеров, которые используют высокоуровневые функции безопасности, смотри Допускать Доступа.

Первый пример показывает использование низкого уровня иметь доступ к-управляющим функциям, чтобы добавлять НЕДЕЙСТВИТЕЛЬНЫЙ DACL к файловому дескриптору безопасности. Пример низкого уровня распределяет буфер дескриптора безопасности и называет функцию InitializeSecurityDescriptor, чтобы инициализировать это. Затем это называет функцию SetSecurityDescriptorDacl, чтобы подключать НЕДЕЙСТВИТЕЛЬНЫЙ DACL к дескриптору безопасности. Наконец, это называет функцию SetFileSecurity, чтобы подключать дескриптор безопасности к файлу. Эквиалентный высокоуровневый пример мог бы выполнить то же действие с единственным вызовом в функцию SetNamedSecurityInfo.



Примечание, которое Вы можете написать код, который строит дескрипторы безопасности из царапины, как в примере. Тем не менее, при сочинении кода, которое строит или манипулирует дескрипторами безопасности, ваш код должен изучить встроенным дескрипторам безопасности эти места Windows NT на объектах. Например, объект может иметь встроенный DACL, что содержит ПЕР.ТОКИ наследовался со своего родительского объекта. А не просто заменяя встроенный DACL, ваш код должен сначала изучать встроенный DACL, чтобы определять хотите Вы включить свои ПЕР.ТОК в новом DACL.



PSECURITY_DESCRIPTOR pSD;

/* Инициализируйте безопасность descriptor. */

pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); /* определенное в WINNT.H */ если (pSD == НЕДЕЙСТВИТЕЛЬНЫЙ) { ErrorHandler("LocalAlloc");
goto Очистка;
}

если (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) { /* ОПРЕДЕЛЕННОЕ в WINNT.H */ ErrorHandler("InitializeSecurityDescriptor");
goto Очистка;
}

/* Добавьте НЕДЕЙСТВИТЕЛЬНЫЙ диск. ACL В безопасность descriptor. */


если (!SetSecurityDescriptorDacl(pSD, ИСТИНА, /* определяя диск. ACL */ (PACL) НЕДЕЙСТВИТЕЛЬНЫЙ, ЛОЖНЫЙ)) { /* не встроенный диск. ACL */ ErrorHandler("SetSecurityDescriptorDacl");
goto Очистка;
}

/* Добавьте дескриптор безопасности к file. */

если (!SetFileSecurity(lpszTestFile, DACL_SECURITY_INFORMATION, pSD)) { ErrorHandler("SetFileSecurity");
goto Очистка;
}

Очистка: если(pSD != НЕДЕЙСТВИТЕЛЬНЫЙ)

LocalFree((HLOCAL) pSD);


Следующий пример показывает использование низкого уровня иметь доступ к-управляющим функциям, чтобы добавлять DACL с допущенным АСОМ доступа в файловый дескриптор безопасности. Пример распределяет и инициализирует дескриптор безопасности, распределяет и инициализирует ACL и распределяет и ищет идентификатор безопасности (SID) для специфированного счета. Затем это добавляет АСА к ACL, добавляет ACL как DACL дескриптор безопасность, и наконец, подключает дескриптор безопасности к файлу. Отметьте, что высокоуровневые функции выполняют многие эти шаги для Вас.

PSECURITY_DESCRIPTOR pSD;
PACL pACLNew;
DWORD cbACL = 1024;
PSID pSID;
DWORD cbSID = 1024;
LPSTR lpszAccount = "UserABC";
LPSTR lpszDomain;
DWORD cchDomainName = 80;
PSID_NAME_USE psnuType;

/* Инициализируйте новую безопасность descriptor. */

pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); /* определенное в WINNT.H */ если (pSD == НЕДЕЙСТВИТЕЛЬНЫЙ) { ErrorHandler("LocalAlloc");

goto Очистка;
}

если (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) { ErrorHandler("InitializeSecurityDescriptor");
goto Очистка;
}

/* Инициализируйте новый ACL. */

pACLNew = (PACL) LocalAlloc(LPTR, cbACL);
если (pACLNew == НЕДЕЙСТВИТЕЛЬНЫЙ) { ErrorHandler("LocalAlloc");
goto Очистка;
}

если (!InitializeAcl(pACLNew, cbACL, ACL_REVISION2)) {

ErrorHandler("InitializeAcl");
goto Очистка;
}

/* Извлеките SID для UserABC. */

pSID = (PSID) LocalAlloc(LPTR, cbSID);
psnuType = (PSID_NAME_USE) LocalAlloc(LPTR, 1024);
lpszDomain = (LPSTR) LocalAlloc(LPTR, cchDomainName);
если (pSID == НЕДЕЙСТВИТЕЛЬНЫЙ || psnuType == НЕДЕЙСТВИТЕЛЬНЫЙ || lpszDomain == НЕДЕЙСТВИТЕЛЬНЫЙ) { ErrorHandler("LocalAlloc");
goto Очистка;
}

если (!LookupAccountName((LPSTR) НЕДЕЙСТВИТЕЛЬНЫЙ, /* локальное имя */

lpszAccount, pSID, &cbSID, lpszDomain, &cchDomainName, psnuType)) { ErrorHandler("LookupAccountName");
goto Очистка;
}
если (!IsValidSid(pSID)) TextOut(hdc, 10, yIncrement += 18, "SID НЕДЕЙСТВИТЕЛЕН.", 17);
еще
TextOut(hdc, 10, yIncrement += 18, "SID В силе.", 13);


/* Допустите прочитанный но не доступ записи к file. */


если (!AddAccessAllowedAce(pACLNew, ACL_REVISION2, GENERIC_READ, pSID)) { ErrorHandler("AddAccessAllowedAce");
goto Очистка;
}

/* Добавьте новый ACL к безопасности descriptor. */

если (!SetSecurityDescriptorDacl(pSD, ИСТИНА, /* флаг fDaclPresent */ pACLNew, FALSE)) { /* не встроенный диск. ACL */ ErrorHandler("SetSecurityDescriptorDacl");

goto Очистка;
}

/* Приложите новый дескриптор безопасности к file. */

если (!SetFileSecurity("d:\\ntfs_sample_file", DACL_SECURITY_INFORMATION, pSD)) { ErrorHandler("SetFileSecurity");
goto Очистка;
}
TextOut(hdc, 10, yIncrement += 18, "УСПЕШНО добавленное допустившее АСА доступа на файловый DACL.", 53);

Очистка: FreeSid(pSID);
если(pSD != НЕДЕЙСТВИТЕЛЬНЫЙ) LocalFree((HLOCAL) pSD);

если(pACLNew != НЕДЕЙСТВИТЕЛЬНЫЙ) LocalFree((HLOCAL) pACLNew);
если(psnuType != НЕДЕЙСТВИТЕЛЬНЫЙ) LocalFree((HLOCAL) psnuType);
если(lpszDomain != НЕДЕЙСТВИТЕЛЬНЫЙ) LocalFree((HLOCAL) lpszDomain);



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