Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#ifndef UNICODE
#define UNICODE
#endif
#define _WIN32_WINNT 0x0500
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#include <aclapi.h>
#include <sddl.h>
int main()
{
HANDLE hProcess; // дескриптор процесса
HANDLE hTokenHandle; // дескриптор маркера доступа
TOKEN_PRIVILEGES tp; // привилегии маркера доступа
DWORD dwLengthOfSID = 0; // длина SID
DWORD dwLengthOfDomainName = 0; // длина имени домена
DWORD dwLengthOfUserName = UNLEN; // длина имени учетной записи
SID *lpSid = NULL; // указатель на SID
LPTSTR lpDomainName = NULL; // указатель на имя домена
SID_NAME_USE type_of_SID; // тип учетной записи
wchar_t wchFileName[248]; // имя каталога
wchar_t wchUserName[UNLEN]; // имя учетной записи
TRUSTEE Trustee; // информация об учетной записи
PACL pSacl = NULL; // указатель на список SACL
PSECURITY_DESCRIPTOR pSd = NULL; // указатель на дескриптор безопасности
ACCESS_MASK amSuccess = 0; // маска для аудита успешного доступа
ACCESS_MASK amFailed = 0; // маска для аудита неудачного доступа
DWORD dwRetCode; // код возврата
// получаем дескриптор процесса
hProcess = GetCurrentProcess();
// получаем маркер доступа процесса
if (!OpenProcessToken(
hProcess, // дескриптор процесса
TOKEN_ALL_ACCESS, // полный доступ к маркеру доступа
&hTokenHandle)) // дескриптор маркера
{
dwRetCode = GetLastError();
printf( "Open process token failed: %u\n", dwRetCode);
return dwRetCode;
}
// устанавливаем общее количество привилегий
tp.PrivilegeCount = 1;
// определяем идентификатор привилегии для установки аудита
if (!LookupPrivilegeValue(
NULL, // ищем идентификатор привилегии на локальном компьютере
SE_SECURITY_NAME, // привилегия для аудита
&(tp.Privileges[0].Luid)))
{
dwRetCode = GetLastError();
printf("Lookup privilege value failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// разрешаем привилегию аудита
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// разрешаем привилегию для установки аудита
if (!AdjustTokenPrivileges(
hTokenHandle, // дескриптор маркера доступа процесса
FALSE, // не запрещаем все привилегии
&tp, // адрес привилегий
0, // длины буфера нет
NULL, // предыдущее состояние привилегий не нужно
NULL)) // длина буфера не нужна
{
dwRetCode = GetLastError();
printf("Lookup privilege value failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// вводим имя файла или каталога, например: C:\\test.txt
printf("Input a full path to your file: ");
_getws(wchFileName);
// получаем дескриптор безопасности файла
dwRetCode = GetNamedSecurityInfo(
wchFileName, // имя файла
SE_FILE_OBJECT, // объект файл
SACL_SECURITY_INFORMATION, // получаем сведения об аудите
NULL, // SID владельца не нужен
NULL, // SID первичной группы не нужен
NULL, // DACL не нужен
&pSacl, // указатель на SACL
&pSd); // адрес указателя на дескриптор безопасности
if (dwRetCode != ERROR_SUCCESS)
{
printf("Get named security info failed.\n");
printf("Error code: %u\n", dwRetCode);
return dwRetCode;
}
// вводим имя пользователя
printf("Input user_name: ");
_getws(wchUserName); // вводим имя учетной записи
// получаем SID учетной записи
// определяем длину SID пользователя
LookupAccountName(
NULL, // ищем имя на локальном компьютере
wchUserName, // имя пользователя
NULL, // определяем длину SID
&dwLengthOfSID, // длина SID
NULL, // определяем имя домена
&dwLengthOfDomainName, // длина имени домена
&type_of_SID); // тип учетной записи
// проверяем, вернула ли функция длину SID
if (dwLengthOfSID == 0)
{
dwRetCode = GetLastError();
printf("Lookup account name failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// распределяем память для SID и имени домена
lpSid = (SID*) new char[dwLengthOfSID];
lpDomainName = (LPTSTR) new wchar_t[dwLengthOfDomainName];
// определяем SID и имя домена пользователя
if(!LookupAccountName(
NULL, // ищем имя на локальном компьютере
wchUserName, // имя пользователя
lpSid, // указатель на SID
&dwLengthOfSID, // длина SID
lpDomainName, // указатель на имя домена
&dwLengthOfDomainName, // длина имени домена
&type_of_SID)) // тип учетной записи
{
dwRetCode = GetLastError();
printf("Lookup account name failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// строим структуру TRUSTEE по идентификатору безопасности
BuildTrusteeWithSid(&Trustee, lpSid);
// получаем аудиторские права пользователя
dwRetCode = GetAuditedPermissionsFromAcl(
pSacl, // адрес списка SACL
&Trustee, // информация об учетной записи
&amSuccess, // адрес маски прав успешного доступа
&amFailed); // адрес маски прав неудачного доступа
if (dwRetCode != ERROR_SUCCESS)
{
printf("Get audited permissions from ACL failed.\n");
printf("Error code: %u\n", dwRetCode);
return dwRetCode;
}
// распечатываем права доступа
printf("Success audit rights: %x\n", amSuccess);
printf("Failed audit rights: %x\n", amFailed);
// запрещаем привилегию аудита
tp.Privileges[0].Attributes = 0;
// разрешаем привилегию для установки аудита
if (!AdjustTokenPrivileges(
hTokenHandle, // дескриптор маркера доступа процесса
FALSE, // не запрещаем все привилегии
&tp, // адрес привилегий
0, // длины буфера нет
NULL, // предыдущее состояние привилегий не нужно
NULL)) // длина буфера не нужна
{
dwRetCode = GetLastError();
printf("Lookup privilege value failed.\n");
printf("Error code: %d\n", dwRetCode);
return dwRetCode;
}
// освобождаем память для дескриптора
LocalFree(pSd);
delete[] lpDomainName;
delete[] lpSid;
return 0;
}
Соседние файлы в папке Листинги