Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.60
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
#1

Списки контроля доступа Access Control List (ACL) - C++

17.09.2013, 18:43. Просмотров 2985. Ответов 24
Метки нет (Все метки)

Есть код помогите идею развить дальше, никак не получаеться, не могу разобраться. Помогите пожалуйста буду очень благодарен.
Нужно создать Списки контроля доступа Access Control List (ACL).
Обьект: мьютекс!
Запретить доступ: read!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    PSID pEveryoneSID = NULL, pAdminSID = NULL, pNetworkSID  = NULL;
    PACL pACL = NULL;
    PSECURITY_DESCRIPTOR pSD = NULL;
    SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;           //deny Access
    SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; //read
    AllocateAndInitializeSid(&SIDAuthNT, 2,SECURITY_BUILTIN_DOMA IN_RID,  
    DOMAIN_ALIAS_RID_ADMI NS,0, 0, 0, 0, 0, 0,&pAdminSID)  //admin
 
    if (ERROR_SUCCESS != SetEntriesInAcl(NUM_ACES,ea,NULL,&pACL))throw GetLastError();
    pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,SECURITY_DESCRIPTOR_MIN_ LENGTH); 
 
        if (!SetSecurityDescriptorDacl(pSD,TRUE,pACL,FALSE)) 
{
    throw GetLastError();
} 
        else {SECURITY_ATTRIBUTES sa;sa.nLength = sizeof(SECURITY_ATTRIBUTES);
                sa.bInheritHandle = FALSE;sa.lpSecurityDescriptor = pSD;
 
if (!CreateDirectory("C:\\Program Files\\MyStuf f", &sa)) throw GetLastError();
Я знаю что этот пример создает всего лишь 3 SID на файл и не создает каких-то прав доступа.
Как это все дальше развить??

Добавлено через 4 минуты
есть еще такой пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "EvryThng.h"
 
#define ACL_SIZE 1024 
 
#define INIT_EXCEPTION 0x3 
 
#define CHANGE_EXCEPTION 0x4 
 
#define SID_SIZE LUSIZE 
 
#define DOM_SIZE LUSIZE
 
LPSECURITY_ATTRIBUTES InitializeUnixSA(DWORD UnixPerms, LPCTSTR UsrNam, LPCTSTR GrpNam, LPDWORD AceMasks, LPHANDLE pHeap) {
 
 HANDLE SAHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0);
 
 LPSECURITY_ATTRIBUTES pSA = NULL;
 
 PSECURITY_DESCRIPTOR pSD = NULL;
 
 PACL pAcl = NULL;
 
 BOOL Success;
 
 DWORD iBit, iSid, UsrCnt = ACCT_NAME_SIZE;
 
 /* Таблицы имен пользователя (User), группы (Group) и прочих пользователей (Everyone), идентификаторов SID и так далее для LookupAccountName и создания SID. */
 
 LPCTSTR pGrpNms[3] = {EMPTY, EMPTY, _T("Everyone")};
 
 PSID pSidTable[3] = {NULL, NULL, NULL};
 
 SID_NAME_USE sNamUse[3] = {SidTypeUser, SidTypeGroup, SidTypeWellKnownGroup};
 
 TCHAR RefDomain[3][DOM_SIZE];
 
 DWORD RefDomCnt[3] = {DOM_SIZE, DOM_SIZE, DOM_SIZE};
 
 DWORD SidCnt[3] = {SID_SIZE, SID_SIZE, SID_SIZE};
 
 __try { /* Блок try-except для исключений при распределении памяти. */
 
  *рНеар = SAHeap;
 
  pSA = HeapAlloc(SAHeap, 0, sizeof (SECURITY_ATTRIBUTES));
 
  pSA->nLength = sizeof(SECURITY_ATTRIBUTES);
 
  pSA->bInheritHandle = FALSE;
 
  /* Программист может выполнить эти установки позже. */
 
  pSD = HeapAlloc(SAHeap, 0, sizeof(SECURITY_DESCRIPTOR));
 
  pSA->lpSecurityDescriptor = pSD;
 
  InitializeSecurityDescriptor(pSD, SECURITY DESCRIPTOR REVISION); 
 
  /* Получить SID пользователя, группы и прочих пользователей. 
 
   * Другие важные подробности можно найти на Web-сайте. */
 
  pGrpNms[0] = UsrNam;
 
  pGrpNms[1] = GrpNam;
 
  for (iSid = 0; iSid < 3; iSid++) {
 
   pSidTable[iSid] = HeapAlloc(SAHeap, 0, SID_SIZE);
 
   LookupAccountName(NULL, pGrpNms[iSid], pSidTable[iSid], &SidCnt[iSid], RefDomain[iSid], &RefDomCnt[iSid], &sNamUse[iSid]);
 
  }
 
  SetSecurityDescriptorOwner(pSD, pSidTable[0], FALSE);
 
  SetSecurityDescriptorGroup(pSD, pSidTable[1], FALSE);
 
  pAcl = HeapAlloc(ProcHeap, HEAP_GENERATE_EXCEPTIONS, ACL_SIZE);
 
  InitializeAcl(pAcl, ACL_SIZE, ACL_REVISION);
 
  /* Добавить все элементы АСЕ, разрешающие и запрещающие доступ. */
 
  for (iBit = 0; iBit < 9; iBit++) {
 
   if ((UnixPerms >> (8 – iBit) & 0x1) != 0 && AceMasks[iBit%3] != 0) AddAccessAllowedAce(pAcl, ACL_REVISION, AceMasks [iBit%3], pSidTable [iBit/3]);
 
   else if (AceMasks[iBit%3] != 0) AddAccessDeniedAce(pAcl, ACL_REVISION, AceMasks [iBit%3], pSidTable [iBit/3]);
 
  }
 
  /* Добавить запрет доступа для всех АСЕ категории "Прочие". */
 
  Success = Success && AddAccessDeniedAce(pAcl, ACL_REVISION, STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL, pSidTable[2]);
 
  /* Связать ACL с атрибутом защиты. */
 
  SetSecurityDescriptorDacl(pSD, TRUE, pAcl, FALSE);
 
  return pSA;
 
 } /* Конец блока try-except. */
 
 __except(EXCEPTION_EXECUTE_HANDLER) { /* Освободить все ресурсы. */
 
  if (SAHeap != NULL) HeapDestroy(SAHeap);
 
  pSA = NULL;
 
 }
 
 return pSA; 
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2013, 18:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Списки контроля доступа Access Control List (ACL) (C++):

Списки контроля доступа Access Control List (ACL) - C++ - C++
Помогите пожалуйста буду очень благодарен. Нужно создать Списки контроля доступа Access Control List (ACL). Обьект: Семафор! ...

Как посмотреть список прав доступа (ACL) к конкретному файлу? - C++
Как с помосчью С++ посмотреть список прав доступа (ACL) к конкретному файлу ? p.s. - Заранее благодарен за ответы .

Из контейнера (напр access-овая форма) передать в ActiveX control двумерный массив - C++
Как реализовать сабж? А то в MSDN-е что-то так закручено -пока не врубиться никак... Цель: из контейнера (напр access-овая форма)...

Access control list deny - Cisco
Вот моя задача Deny 16.1.1.60 до 70 ----&gt; 172.16.6.75 до 85 включает 3 машрутизатор и 3 каммутотор Кто знает?Как мне нужно писать...

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is pr - AngularJS
$scope.testsearcher = function(event){ var httpConfig = {method: 'GET', url:...

ACL списки - Cisco
Здравствуйте.По первому заданию сделала 76%, не знаю как до делать,чтоб было 100%.Помогите,пожалуйста. Со вторым вообще не разобралась....

24
Убежденный
Ушел с форума
Эксперт С++
15937 / 7247 / 1140
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
21.09.2013, 16:05 #16
Цитата Сообщение от MrWoolf Посмотреть сообщение
Я уже начинаю путаться
Значит, пора отдыхать.
Или перечитать еще раз соответствующие статьи, главы и т.п.

Цитата Сообщение от MrWoolf Посмотреть сообщение
HANDLE hMutex = ::CreateMutex(NULL, TRUE, MY_MUTEX_NAME);
(LPSECURITY_ATTRIBUTES lpMutexAttributes,// атрибут безопастности
BOOL bInitialOwner,// флаг начального владельца
LPCTSTR lpName// имя объекта
);
Это что вообще такое ?
У Вас же был на 99% готовый код с установкой дескриптора безопасности для мьютекса.
0
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
22.09.2013, 13:07  [ТС] #17
Он и так есть, я просто запутался что нужно делать...
Значит вот наш почти готовый код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// LR3.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <aclapi.h>
#include <iostream>
int main()
{
    DWORD dwDisposition;
    PSID pEveryoneSID = NULL;
    PACL pACL = NULL;
    PSECURITY_DESCRIPTOR pSD = NULL;
    EXPLICIT_ACCESS ea;
    SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
    SECURITY_ATTRIBUTES sa;
    LONG lRes;
 
    // Create a well-known SID for the Everyone.
    AllocateAndInitializeSid(&SIDAuthWorld, 1,
                             SECURITY_WORLD_RID,
                             0, 0, 0, 0, 0, 0, 0,
                             &pEveryoneSID);
 
    // Initialize an EXPLICIT_ACCESS structure for an ACE.
 
    ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
    ea.grfAccessPermissions = GENERIC_ALL;    /*Запрет доступа*/
    ea.grfAccessMode        = DENY_ACCESS;
    ea.grfInheritance       = NO_INHERITANCE;
    ea.Trustee.TrusteeForm  = TRUSTEE_IS_SID;
    ea.Trustee.TrusteeType  = TRUSTEE_IS_WELL_KNOWN_GROUP;
    ea.Trustee.ptstrName    = (LPTSTR) pEveryoneSID;
 
    // Create a new ACL that contains the new ACEs.
    SetEntriesInAcl(1, &ea, NULL, &pACL);
 
    // Initialize a security descriptor.
    pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
                             SECURITY_DESCRIPTOR_MIN_LENGTH);
 
    InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
 
    // Add the ACL to the security descriptor.
    SetSecurityDescriptorDacl(pSD,
            TRUE,     // bDaclPresent flag
            pACL,
            FALSE);   // not a default DACL
 
    // Initialize a security attributes structure.
    sa.nLength = sizeof (SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = pSD;
    sa.bInheritHandle = FALSE;
 
   // Start of process B
HANDLE hMutex = ::CreateMutex(NULL, TRUE, MY_MUTEX_NAME);
MessageBox(NULL, _T("PROCESS B !"), _T("TEST"), 0); 
CloseHandle(hMutex);
// End of process B
 
 
// Start of process A
HANDLE hMutex = ::OpenMutex(SYNCHRONIZE, FALSE, MY_MUTEX_NAME);
if(hMutex != NULL)
{
   MessageBox(NULL, _T("PROCESS B is alive !"), _T("TEST"), 0); 
}
CloseHandle(hMutex);
 
DWORD   dwLastError = ::GetLastError();
TCHAR   lpBuffer[256] = _T("?");
if(dwLastError != 0)    // Don't want to see a "operation done successfully" error ;-)
    ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,                 // Itґs a system error
                     NULL,                                      // No string to be formatted needed
                     dwLastError,                               // Hey Windows: Please explain this error!
                     MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),  // Do it in the standard language
                     lpBuffer,              // Put the message here
                     STR_ELEMS(lpBuffer)-1,                     // Number of bytes to store the message
                     NULL);
// End of process A
    FreeSid(pEveryoneSID);
    LocalFree(pACL);
    LocalFree(pSD);
    std::cin.get();
    return 0;
}
мне нужно определить
1. SECURITY_ATTRIBUTES для мьютекса
2. проверка ошибок

1.)
C++
1
2
3
4
5
6
7
 // Initialize a security attributes structure.
    sa.nLength = sizeof (NULL, SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = pSD;
    sa.bInheritHandle = FALSE;
 
   // Start of process B
HANDLE hMutex = ::CreateMutex(NULL, TRUE, MY_MUTEX_NAME);
2.) ??

Добавлено через 20 часов 45 минут
Товарищи подскажите что дальше делать...?
0
Убежденный
Ушел с форума
Эксперт С++
15937 / 7247 / 1140
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
22.09.2013, 13:36 #18
Цитата Сообщение от MrWoolf Посмотреть сообщение
мне нужно определить
1. SECURITY_ATTRIBUTES для мьютекса
Сурово...
Я отвечал на этот вопрос уже три раза.

Цитата Сообщение от MrWoolf Посмотреть сообщение
2. проверка ошибок
И в чем проблема ?
У каждой функции есть описание в MSDN, там в числе прочего указано,
что она возвращает в случае ошибки. GetLastError тоже никто не отменял.

Цитата Сообщение от MrWoolf Посмотреть сообщение
Добавлено через 20 часов 45 минут
Товарищи подскажите что дальше делать...?
Сидеть сложа руки еще 20 часов и ждать, пока кто-нибудь сжалится.

P.S. Отписался от темы.
0
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
22.09.2013, 15:42  [ТС] #19
а вот это по вашему не проверка на ошибки??
C++
1
2
3
4
5
6
7
8
9
10
DWORD   dwLastError = ::GetLastError();
TCHAR   lpBuffer[256] = _T("?");
if(dwLastError != 0)    // Don't want to see a "operation done successfully" error ;-)
    ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,                 // Itґs a system error
                     NULL,                                      // No string to be formatted needed
                     dwLastError,                               // Hey Windows: Please explain this error!
                     MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),  // Do it in the standard language
                     lpBuffer,              // Put the message here
                     STR_ELEMS(lpBuffer)-1,                     // Number of bytes to store the message
                     NULL);
да конечно, на язык все грамотны а показать на примере или помоч... так сразу не кого... спасибо я в книге могу тоже самое прочесть...
этот форум был создан для того чтоб книги советовать или помогать людям??
0
alsav22
22.09.2013, 16:01
  #20

Не по теме:

Цитата Сообщение от MrWoolf Посмотреть сообщение
да конечно, на язык все грамотны а показать на примере или помоч... так сразу не кого... спасибо я в книге могу тоже самое прочесть...
этот форум был создан для того чтоб книги советовать или помогать людям??
Это сказано, в знак благодарности, человеку за то, что он с вами столько возится?

0
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
22.09.2013, 16:24  [ТС] #21
Я этому человеку очень благодарен, но он выразился не коректно я не сижу зложа руки и ничего не делаю...
и не жду чтоб кто-то зжалился, я прошу мне весь код писать я попросил исправить то что у меня не правельно, раз у меня на 99% готово так что сложно помоч.
0
alsav22
22.09.2013, 17:09
  #22

Не по теме:

Но если на 99%, то может самому дожать? Почитать, подумать?

0
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
22.09.2013, 17:56  [ТС] #23
Я зашел на этот с той целью что мне помогут, если у меня получилось бы самому дожать смысл бы мне сюда заходить??
Я не бог программирования и не проффесионал, еслиб я им был, я б сюда не заходил...
0
alsav22
22.09.2013, 18:07
  #24

Не по теме:

Цитата Сообщение от MrWoolf Посмотреть сообщение
Я зашел на этот с той целью что мне помогут
Сначала же не было на 99%. Помогли уже... Помочь и сделать - это, всё-таки, не одно и тоже...

0
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
22.09.2013, 21:14  [ТС] #25
Я не буду с вами спорить, не хочу дескутировать спасибо что помогли....
0
22.09.2013, 21:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 21:14
Привет! Вот еще темы с ответами:

Просмотр списка прав доступа (ACL) к конкретному файлу - Visual C++
Как с помосчью С++ посмотреть список прав доступа (ACL) к конкретному файлу ? p.s. - Заранее благодарен за ответы .

Как вывести номера Control-ов на форме для более удобного контроля - VBA
может кому пригодится Если на форме используется много Контролов (например - когда вынужден создавать формы ввода данных) - бывает...

Синхронизация доступа к элементам List<List<SomeClass>> - C#
Допустим, имеем класс class Row{ int Value {get; set;} int ID {get; set;} //.... }

Как с помощью WinApi посмотреть список прав доступа (ACL) к конкретному файлу? - C++ WinAPI
нужно узнать кому конкретно розшаренный тот или инной файл ? Буду очень благодарен !


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru