Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Листинги / Листинги / 45-08-GetUserObjectSecurity

.cpp
Скачиваний:
4
Добавлен:
24.03.2016
Размер:
4.41 Кб
Скачать
#include <windows.h>
#include <stdio.h>

int main()
{
  HWINSTA hWindow = NULL;      // дескриптор окна
  
  DWORD dwLengthOfSd = 0;      // длина SD
  SECURITY_DESCRIPTOR *lpSd = NULL;  // дескриптор безопасности мьютекса

  // получаем информацию о владельце окна
  SECURITY_INFORMATION si = OWNER_SECURITY_INFORMATION;
  
  PSID lpOwner;    // указатель на SID владельца
  BOOL bOwnerDefaulted = FALSE;      // признак владельца по умолчанию
  
  DWORD  dwLengthOfUserName = 0;     // длина имени учетной записи 
  DWORD  dwLengthOfDomainName = 0;   // длина имени домена
  
  LPTSTR  lpUserName = NULL;         // указатель на имя домена
  LPTSTR  lpDomainName = NULL;       // указатель на имя домена
  
  SID_NAME_USE type_of_SID;          // тип учетной записи
  
  DWORD dwRetCode;   // код возврата

  // получаем дескриптор станции окон
  hWindow = GetProcessWindowStation();
  
  // определяем длину идентификатор безопасности окна
  if (!GetUserObjectSecurity(
    hWindow,         // дескриптор станции окна
    &si,             // получаем владельца окна
    lpSd,            // адрес SD
    dwLengthOfSd,    // определяем длину
    &dwLengthOfSd))  // требуемая длина буфера
  {
    dwRetCode = GetLastError();

    if (dwRetCode == ERROR_INSUFFICIENT_BUFFER)
      // захватываем память под дескриптор безопасности
      lpSd = (SECURITY_DESCRIPTOR*)new char[dwLengthOfSd];
    else
    {
      printf("GetUserObjectSecurity for length failed.\n");
      printf("The last error code: %u\n", dwRetCode);

      return dwRetCode;
    }
  }
  
  // читаем идентификатор безопасности окна
  if (!GetUserObjectSecurity(
    hWindow,         // дескриптор станции окна
    &si,             // получаем владельца окна
    lpSd,            // адрес SD
    dwLengthOfSd,    // определяем длину
    &dwLengthOfSd))  // требуемая длина буфера
  {
    dwRetCode = GetLastError();

    printf("GetUserObjectSecurity failed.\n");
    printf("The last error code: %u\n", dwRetCode);
    
    return dwRetCode;
  }
  
  // получаем SID владельца окна
  if (!GetSecurityDescriptorOwner(
    lpSd,                // адрес дескриптора безопасности
    &lpOwner,            // адрес указателя на SID владельца
    &bOwnerDefaulted))   // признак владельца по умолчанию
  {
    dwRetCode = GetLastError();
    printf("Get security descriptor owner failed.\n");
    printf("Error code: %d\n", dwRetCode);
    
    return dwRetCode;
  }
  
  // проверяем, есть ли владелец
  if (lpOwner == NULL)
  {
    printf("The owner is not present.\n");
    
    return 0;
  }
  
  if (bOwnerDefaulted)
    printf("The owner is defaulted.\n");

  // определяем длину имени домена
  if(!LookupAccountSid(
    NULL,              // ищем на локальном компьютере
    lpOwner,           // указатель на SID
    lpUserName,        // имя пользователя
    &dwLengthOfUserName,     // длина имени пользователя
    lpDomainName,      // определяем имя домена
    &dwLengthOfDomainName,   // длина имени домена
    &type_of_SID))     // тип учетной записи
  {
    dwRetCode = GetLastError();
    
    if (dwRetCode == ERROR_INSUFFICIENT_BUFFER)
    {
      // распределяем память под имя пользователя и имя домена
      lpUserName = (LPTSTR) new char[dwLengthOfUserName];
      lpDomainName = (LPTSTR) new char[dwLengthOfDomainName];
    }
    else
    {
      printf("Lookup account SID for length failed.\n");
      printf("Error code: %d\n", dwRetCode);
      
      return dwRetCode;
    }
  }
  
  // определяем имя учетной записи по SID
  if(!LookupAccountSid(
    NULL,              // ищем на локальном компьютере
    lpOwner,           // указатель на SID пользователя
    lpUserName,        // имя пользователя
    &dwLengthOfUserName,     // длина имени пользователя
    lpDomainName,      // определяем имя домена
    &dwLengthOfDomainName,   // длина имени домена
    &type_of_SID))     // тип учетной записи
  {
    dwRetCode = GetLastError();
    
    printf("Lookup account SID failed.\n");
    printf("Error code: %d\n", dwRetCode);
    
    return dwRetCode;
  }
  
  printf("Key owner name: %s\n", lpUserName);
  printf("Key owner domain name: %s\n", lpDomainName);
  
  // освобождаем память
  delete[] lpUserName;
  delete[] lpDomainName;
  delete[] lpSd;
  
  return 0;
}
Соседние файлы в папке Листинги