Как програмно да предоставите или отнемете привилегия
Когато създавате някои приложения за Windows NT, може да се сблъскате с предизвикателството да управлявате програмно потребителските привилегии. Например, за да може да се изпълнява услуга, регистрирана под собствен акаунт, трябва да му бъде предоставено правото да влезе като услуга. Разбира се, можете да насочите потребителя към контролния панел, за да направите това, като използвате стандартния потребителски интерфейс на Windows NT, но е много по-добре, ако инсталаторът на вашия продукт прави това автоматично. В тази статия ще разгледаме механизмите, предоставени от Windows NT за програмно управление на потребителските привилегии и права.
Административният орган на компютъра е необходим за управление на потребителските привилегии и права. Всички примери, предоставени в тази статия, се предполага, че се изпълняват от името на потребител, който е член на локалната група администратори на целевата машина.
API на Local Security Authority
В Windows NT всички проблеми със сигурността се обработват от защитена подсистема, известна като Local Security Authority (LSA). Тази подсистема поддържа база данни с акаунти, включително информация за потребителските права. По отношение на използваните структури от данни, LSA API е по-подобен на Windows NT собствен API, отколкото Win32. Много дефинирани от LSA структури от данни имат директни аналози в родния API и в API на режим на ядрото, използвани от драйверите на устройства.
Една такава структура на данните е LSA_UNICODE_STRING, който дефинира низ, състоящ се от Unicode символи. За разлика от обикновените C низове, където краят се обозначава с нулев символ, дължината на низа, дефиниран от тази структура, е посочена изрично.
Искам да обърна внимание на факта, че полетата Дължина и Максимална дължина съдържат стойности в байтове, а не в символи, както е в Win32. В примерите по-долу ще използваме функцията InitUnicodeString (вижте Листинг 1), който инициализира тази структура на базата на нормален C низ, завършен с нулев символ (тези, които са разработвали драйвери на устройства, сега трябва да запомнят функцията за съгласна, предоставена от системата).
Друга концепция, заимствана от родния API, е връщаната стойност от тип NTSTATUS; по-голямата част от функциите на LSA имат тази възвръщаема стойност. NTSTATUS е 32-битова стойност, чиято структура е подобна на тази на HRESULT, широко използвана в COM. За разлика от HRESULT, който показва или успех, или неуспех, NTSTATUS има четири степени на успех, кодирани в двата най-значими бита. За да проверите стойността на типа NTSTATUS, използвайте макроса LSA_SUCCESS.