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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разрешения на доступ к папке, Программно установить разрешение 
V
    Опции темы
Pulse69
Дата 25.7.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет!
Есть вопросик. Мне нужно программно для определённого пользователя установить права на чтение/запись в папку. Я порыл в сторону ACL, но пока ничего не ясно. Может, кто-нибудь может подкинуть идею?
Заранее спасибо. 
--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
ElcnU
Дата 25.7.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

BOOL SetFileSecurity(
  LPCTSTR lpFileName,
  SECURITY_INFORMATION SecurityInformation,
  PSECURITY_DESCRIPTOR pSecurityDescriptor
);
BOOL GetFileSecurity(
  LPCTSTR lpFileName,
  SECURITY_INFORMATION RequestedInformation,
  PSECURITY_DESCRIPTOR pSecurityDescriptor,
  DWORD nLength,
  LPDWORD lpnLengthNeeded
);

с помощью этих функций 
аналогична команде в кансоле CACLS  

Это сообщение отредактировал(а) ElcnU - 25.7.2006, 13:17
PM MAIL   Вверх
Pulse69
Дата 26.7.2006, 04:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ThanX, попробую.
Кстать, в МСДНе написано, что ф-ции устаревшие и использовать надо SetNamedSecurityInfo
 
--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
Pulse69
Дата 26.7.2006, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, помогло. Если кому-нибудь нужно, вот код:

Код

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

#include "stdafx.h"

#include <conio.h>



int _tmain(int argc, _TCHAR* argv[])
{
    char *path = "C:\\Dir";
    char *usr  = "Den";
    
    DWORD dwRes = 0;
    PACL pOldDACL = NULL, pNewDACL = NULL;
    PSECURITY_DESCRIPTOR pSD = NULL;
    EXPLICIT_ACCESS ea;

    //    Получаем указатель на существующий 
    //    список контроля доступа объекта

    dwRes = GetNamedSecurityInfo(
        path,
        SE_FILE_OBJECT,      //  объект - файл или папка
          DACL_SECURITY_INFORMATION,
          NULL, 
          NULL, 
          &pOldDACL, 
          NULL, 
          &pSD);


    if (ERROR_SUCCESS != dwRes) {
        printf( "GetNamedSecurityInfo Error %u\n", dwRes );
        goto Cleanup; 
    }

    // Инициализируем структуру для нового элемента
    //    списка контроля доступа

    ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
    ea.grfAccessPermissions = GENERIC_READ; // только чтение
    ea.grfAccessMode = GRANT_ACCESS;
    ea.grfInheritance= CONTAINER_INHERIT_ACE;
    ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME; // указывает тип элемента ptstrName
    ea.Trustee.ptstrName = usr;  // для кого устанавливается доступ ( здесь можно указать имя или SID)

    //    создаём новый список контроля доступа, в который будет входить новый элемент
    //    с установленными разрешениями.

    dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
    if (ERROR_SUCCESS != dwRes)  {
        printf( "SetEntriesInAcl Error %u\n", dwRes );
        goto Cleanup; 
    }  


    //    Соединяем новый список с существующим списком объекта

    dwRes = SetNamedSecurityInfo(path, SE_FILE_OBJECT, 
          DACL_SECURITY_INFORMATION,
          NULL, NULL, pNewDACL, NULL);
    if (ERROR_SUCCESS != dwRes)  {
        printf( "SetNamedSecurityInfo Error %u\n", dwRes );
        goto Cleanup; 
    }  



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

    getch();
    return 0;

}
 
--------------------
Ctrl+Alt+Reset 
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.0653 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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