Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос об аудите реестра Windows, Пользователи и их аудиты на ключ 
:(
    Опции темы
fijik
Дата 26.1.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.1.2007

Репутация: нет
Всего: нет



Здравствуйте!

Вопрос вот в чем:
входные параметры: путь к ключу реестра.
выходные параметры: вывести список пользователей и тип их аудитов на данный ключ.

Если кто сталкивался с подобной задачей-помогите, кто чем может smile
PM MAIL   Вверх
Pulse69
Дата 27.1.2007, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



Извини, сейчас нет времени писать код. Примерно действовать нужно так.


1. Получаешь списки ACL для ветки реестра. Есть ф-ция GetNamedSecurityInfo, которая это делает.

2. Функция GetAuditedPermissionsFromAcl, из списка ACL получает тип аудитов для определённого пользоавтеля.

Как перечислить всех пользователей, для которых назначен аудит  я точно не знаю, но могут помочь низкоуровневые функции.

Примерно так.
С помощью GetAclInformation получаешь количество записей в списке ACL.
В цикле получаешь каждый элемент (ACE) списка  (ф-ция GetAce). Функция возвращает тип ACE_HEADER.
Затем, можно узнать тип элемента, и если он относится к одному из типов аудита, привести его к нужной структуре и получить SID пользователя.
Потом уже можно заполнить структуру TRUSTEE и вызвать GetAuditedPermissionsFromAcl, чтобы получить все политики аудита для этого пользователя.



--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
fijik
Дата 29.1.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.1.2007

Репутация: нет
Всего: нет



Круто. В принципе, я так и пытался действовать... Но запутался где откуда чего передавать и т.д.... Если все же есть возможночсть помоги с кодом... smile
PM MAIL   Вверх
Pulse69
Дата 30.1.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



Я просто вывел на экран маски доступа.
Посмотри в MSDN топик ACCESS_MASK data type [Security].
ЗЫЖ
Код стрёмный, нужно кое-что подчистить, но работает.

Код

// getregistryauditpolitics.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <vector>
#include <iostream>
#include <conio.h>

#include <WINDOWS.H>
#include <AccCtrl.h>
#include <Aclapi.h>

#pragma comment( lib, "Advapi32.lib" )

typedef std::vector<PSID> PSIDVECTOR;

//    Устанавливает привелегии для получения списков аудита
void SetSecurity()
{
   HANDLE hToken; 
   TOKEN_PRIVILEGES tkp; 
 
   if (!OpenProcessToken(GetCurrentProcess(), 
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
      return; 
 
   LookupPrivilegeValue(NULL, SE_SECURITY_NAME, 
        &tkp.Privileges[0].Luid); 
 
   tkp.PrivilegeCount = 1;      
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
 
   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
        (PTOKEN_PRIVILEGES)NULL, 0); 
}

//    Проверяет, содержит ли вектор SID
bool vectorContains( PSIDVECTOR &vect, PSID sid )
{    
    for( PSIDVECTOR::iterator i = vect.begin(); i != vect.end(); i++)
    {
        if( EqualSid((*i), sid ) ) return true;
    }
    return false;
}

//    Получает и выводит инфу о типах аудита пользователей.
//    IN:
//        pSID -- SID пользователя
//        pAcl - Системный список контроля доступа для объекта
void showAuditPolicy( PSID pSID, PACL pAcl )
{
    TCHAR userName[260];
    TCHAR userDomain[260];
    DWORD sizeofUserName = sizeof( userName )/sizeof(TCHAR);
    DWORD sizeofDomain = sizeof( userDomain )/sizeof(TCHAR);
    SID_NAME_USE peuse;

    //    Получаем имя и домен пользователя
    if(!LookupAccountSid( NULL,
        pSID,
        userName,
        &sizeofUserName,
        userDomain,
        &sizeofDomain,
        &peuse) )
    {
        std::wcout << TEXT("User unknown\t");
    }
    else
    {
        std::wcout << userDomain << TEXT("\\") << userName << TEXT("\t");
    }

    //    Маски аудита для успеха и отказа
    ACCESS_MASK succ, fail;

    //    Заполняем структуру, обозначающую пользователя
    TRUSTEE trustee;
    trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
    trustee.pMultipleTrustee = NULL;
    trustee.ptstrName = (LPWSTR)pSID;
    trustee.TrusteeForm = TRUSTEE_IS_SID;
    trustee.TrusteeType = TRUSTEE_IS_UNKNOWN;

    //    Получаем маски политик аудита
    if( GetAuditedPermissionsFromAcl( pAcl, &trustee, &succ, &fail ) != NO_ERROR ) 
    {
        std::wcout << TEXT("policy unknown") << std::endl;
        return;
    }
    //    Выводим их на экран
    std::wcout << TEXT("SUCCESS: ") << succ << TEXT(" FAILED: ") << fail << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SetSecurity();


    PSIDVECTOR sidVect;

    PACL pAcl                            = NULL;
    PSECURITY_DESCRIPTOR pObjSid        = NULL;
    TCHAR obj[]                            = {L"CURRENT_USER\\SOFTWARE"};
    ACE_HEADER *pAceHeader                = NULL;
    SYSTEM_AUDIT_ACE *sys_audit            = NULL;
    SYSTEM_AUDIT_OBJECT_ACE *obj_audit    = NULL;
    PSID pSID;

    try
    {
        //    Получаем инфу о ветке
        DWORD dwRet = GetNamedSecurityInfo( 
            obj,
            SE_REGISTRY_KEY,
            SACL_SECURITY_INFORMATION,
            NULL,
            NULL,
            NULL,
            &pAcl,
            &pObjSid);
        if( dwRet!=NO_ERROR ) throw 0;

        ACL_SIZE_INFORMATION asize;

        if(!pAcl ) 
        {
            std::wcout << TEXT("Empty ACCESS CONTROL LIST") << std::endl;
            throw 0;
        }

        //    Узнаём количество записей в ACL
        if(!GetAclInformation( pAcl, &asize, sizeof( asize ), AclSizeInformation )) throw 0;

        //    Пройдём по всем записям
        for( DWORD i = 0; i < asize.AceCount; i++ )
        {
            //    получаем элемент
            if(!GetAce( pAcl, i, (LPVOID*)&pAceHeader ) ) continue;

            pSID = NULL;

            //    Если это тип аудита, получаем указатель на соотв. структуру
            switch( pAceHeader->AceType )
            {
            case SYSTEM_AUDIT_ACE_TYPE:
                sys_audit = (SYSTEM_AUDIT_ACE*)pAceHeader;
                pSID = &(sys_audit->SidStart);
                break;

            case SYSTEM_AUDIT_OBJECT_ACE_TYPE:
                obj_audit = (SYSTEM_AUDIT_OBJECT_ACE*)pAceHeader;
                pSID = &(obj_audit->SidStart);
                break;

            default:
                pSID = NULL;
                break;
            }

            if(!pSID) continue;
            if(!IsValidSid( pSID ) ) continue;

            //    Если такого SID ещё не было, запихиваем его в вектор
            if( !vectorContains( sidVect, pSID ) )
            {
                sidVect.push_back( pSID );
            }
        }

        ////////////////////////////////////////
        //    Собсно, считываем политики аудита
        for( PSIDVECTOR::iterator i = sidVect.begin(); i!= sidVect.end(); i++ )
        {
            showAuditPolicy( (*i), pAcl );
        }
    }
    catch( ... )
    {
    }

    if( pObjSid ) LocalFree( pObjSid );

    _getch();

    return 0;
}




Это сообщение отредактировал(а) Pulse69 - 30.1.2007, 17:02
--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
fijik
Дата 16.2.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.1.2007

Репутация: нет
Всего: нет



В процессе написания появилась еще проблемма.
Может кто знает, как это решается.

В типах аудита есть SUCCESS, FAILED и есть ALL (это когда указаны и  SUCCESS и FAILED). Как его получить???!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1178 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.