Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.60
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
17.09.2013, 18:43     Списки контроля доступа Access Control List (ACL) #1
Есть код помогите идею развить дальше, никак не получаеться, не могу разобраться. Помогите пожалуйста буду очень благодарен.
Нужно создать Списки контроля доступа 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; 
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
17.09.2013, 22:31     Списки контроля доступа Access Control List (ACL) #2
Цитата Сообщение от MrWoolf Посмотреть сообщение
Нужно создать Списки контроля доступа Access Control List (ACL).
Обьект: мьютекс!
Запретить доступ: read!
В этой формулировке не хватает одного - кому нужно запретить доступ ?
Имя, сестра, имя ! (c) Нужен SID или имя пользователя или группы.

Цитата Сообщение от MrWoolf Посмотреть сообщение
Я знаю что этот пример создает всего лишь 3 SID на файл и не создает каких-то прав доступа.
Создает. В CreateDirectory используется дескриптор безопасности с
установленными правами доступа.

Цитата Сообщение от MrWoolf Посмотреть сообщение
есть еще такой пример
...
Почитайте "Системное программирование в Windows" (А. Побегайло), там
есть целая глава, посвященная безопасности.
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
19.09.2013, 19:09  [ТС]     Списки контроля доступа Access Control List (ACL) #3
Нужно создать две програмулины.

1. Создает обьект мьютекс.

2. Мытаеться открыть мьютекс и получает запрет на чтение.

Они должны работать вместе, одна создает мьютекс и делает на него запред а другая пытаеться получить доступ, и получает запрет на него, и выводить собщение об отказе в доступе.
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
19.09.2013, 20:00     Списки контроля доступа Access Control List (ACL) #4
Создайте мьютекс с пустым дескриптором безопасности. Будет запрет для всех.
Ну или можно создать дескриптор безопасности с одним запрещающим
элементом в списке контроля доступа - GENERIC_ALL для группы "Everyone".
Получится практически тот же эффект.

Разумеется, администраторы и система могут обойти эту "защиту", установив привилегию
"take ownership" и выполнив последовательность WRITE_OWNER/WRITE_DAC.
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
19.09.2013, 22:21  [ТС]     Списки контроля доступа Access Control List (ACL) #5
Тема для меня новая, по этому не имею представления как это сделать.
Нам дали тему, кучу кода и ничего не обьяснили. Не имею представления как это сделать.
Пмогите, просветите пожалуйста.
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
19.09.2013, 22:50     Списки контроля доступа Access Control List (ACL) #6
Книгу по системному программированию я уже упомянул.
Есть еще MSDN. И Поиск в Google
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
20.09.2013, 07:23  [ТС]     Списки контроля доступа Access Control List (ACL) #7
а примера робочей программы нету??
там много функций а не пойму как их связать...
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
20.09.2013, 10:47     Списки контроля доступа Access Control List (ACL) #8
Для начала нужно разобраться с терминологией.
Что такое SID, что такое дескриптор безопасности и список контроля доступа, какие бывают
права доступа и как они наследуются, что такое привилегии, access token и т.д.
Описывать это все здесь не имеет смысла, лучше обратитесь к соответствующей литературе.

Создать защищенный объект можно разными способами.

Способ I.

1) Создайте SID-ы групп или пользователей, доступ которых к объекту нужно регламентировать.
Это можно сделать с помощью AllocateAndInitializeSid, но еще проще - через CreateWellKnownSid.

2) Заполните массив структур EXPLICIT_ACCESS, указав в каждом элементе тип доступа
(разрешать/запрещать), права доступа (например, GENERIC_ALL или GENERIC_READ, или
что-то более специфическое), а также SID, полученный в пункте 1.
Там же указываются различные флаги, например должны ли дочерние объекты наследовать
установленные права доступа или нет.

3) Дальше можно создать дескриптор безопасности - BuildSecurityDescriptor.
После этого данный дескриптор можно передавать как параметр структуры SECURITY_ATTRIBUTES при
создании объекта. Другой путь - вызвать SetEntriesInAcl, она вернет список контроля доступа (DACL),
который потом можно установить для уже созданного объекта при помощи таких функций, как
SetSecurityInfo или SetNamedSecurityInfo.

Способ II.

1) Опишите права доступа на языке SDDL (Security Descriptor Definition Language).
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Например, строка "O:BAG:BAD:P(A;;GA;;;BA)(A;;GR;;;WD)" означает следующее:

O:BA

(O)wner (владелец объекта) - встроенная группа "Администраторы", (B)uiltin (A)dministrators.

G:BA

(G)roup (первичная группа) - тоже Builtin Administrators.

D:P

(D)ACL (список контроля доступа), флаг (P) - protected, т.е. объект не наследует
права доступа от родительских объектов.

Дальше идут элементы контроля доступа, их два:

(A;;GA;;;BA) - это:

A - Allow Access, тип доступа = разрешающий
GA - GENERIC_ALL, полный доступ
BA - это SID группы/пользователя, в данном случае снова администраторы.

(A;;GR;;;WD) - это:

A - разрешающий доступ.
GR - GENERIC_READ, доступ только на чтение
WD - World Sid, группа "Все".

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

2) Вызываем функцию ConvertStringSecurityDescriptorToSecurityDescriptor.
Она сконвертирует строковое представление дескриптора безопасности в его бинарный формат.

3) С созданным дескриптором безопасности можно выполнять действия, аналогичные описанным в способе I.

Есть другие способы и другие функции.
Вот несколько примеров из MSDN:

Creating a Security Descriptor for a New Object in C++
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Modifying the ACLs of an Object in C++
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Taking Object Ownership in C++
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Enabling and Disabling Privileges in C++
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
20.09.2013, 21:11  [ТС]     Списки контроля доступа Access Control List (ACL) #9
Вот что получилось
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
#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_EXECUTE; /*собственно здесь и должна прописываться Смена разрешений */
    ea.grfAccessMode        = SET_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;
 
    CreateFile("d:\\1.txt", GENERIC_WRITE,
                            FILE_SHARE_READ,
                            &sa,
                            OPEN_ALWAYS,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);
    FreeSid(pEveryoneSID);
    LocalFree(pACL);
    LocalFree(pSD);
    std::cin.get();
    return 0;
}
не знаю как с мьютексом сделать.
и второе не знаю как все это сделать на два окна. т.е на две программы
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
20.09.2013, 21:55     Списки контроля доступа Access Control List (ACL) #10
Ну вот, Вы на верном пути, осталось совсем чуть-чуть. Что нужно сделать ?
Полностью запретить доступ всем ? Тогда поставьте ea.grfAccessPermissions = GENERIC_ALL,
grfAccessMode = DENY_ACCESS. Такой же эффект будет при использовании пустого DACL.
Не путать с нулевым DACL, если что (пустой DACL - это нет доступа, нулевой DACL - это
доступ для всех).

По поводу пункта 2.
У мьютекса, как и у многих объектов ядра, есть имя (см. последний параметр CreateMutex).
Первый процесс создает именованный мьютекс, второй пытается открыть мьютекс по имени.
Например, при помощи OpenMutex. Если все правильно сделаете, OpenMutex завершится с
ошибкой, а GetLastError вернет код 5 (access denied - нет доступа).
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
21.09.2013, 14:51  [ТС]     Списки контроля доступа Access Control List (ACL) #11
В итоге вот что получилось....
Можете показать где ошибки?
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;
}
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
21.09.2013, 15:13     Списки контроля доступа Access Control List (ACL) #12
Цитата Сообщение от MrWoolf Посмотреть сообщение
Можете показать где ошибки?
Главная ошибка этого кода - отсутствие проверки ошибок.
Поэтому если он не работает, нельзя точно сказать, где именно.

Цитата Сообщение от MrWoolf Посмотреть сообщение
// 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);
В CreateMutex забыли передать экземпляр структуры SECURITY_ATTRIBUTES.
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
21.09.2013, 15:27  [ТС]     Списки контроля доступа Access Control List (ACL) #13
Т.е вот это проверка на ошибки
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);
должна быть в этом блоке?
C++
1
2
3
4
5
6
// 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);
я правельно понял?
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
21.09.2013, 15:38     Списки контроля доступа Access Control List (ACL) #14
Цитата Сообщение от MrWoolf Посмотреть сообщение
Т.е вот это проверка на ошибки
В функции main 6 функций, работа которых критична для программы -
AllocateAndInitializeSid, SetEntriesInAcl, LocalAlloc, InitializeSecurityDescriptor,
SetSecurityDescriptorDacl и CreateMutex. Ни одна не проверяется на ошибку.

SECURITY_ATTRIBUTES, в которую записан новый дескриптор безопасности,
нужно передать первым аргументом в CreateMutex. Если указывать NULL, мьютекс
будет создан с дескриптором безопасности по умолчанию.
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
21.09.2013, 15:49  [ТС]     Списки контроля доступа Access Control List (ACL) #15
Я уже начинаю путаться

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void main()
{
HANDLE mut;
mut = CreateMutex(NULL, FALSE, "FirstStep");
DWORD result;
result = WaitForSingleObject(mut,0);
if (result == WAIT_OBJECT_0) 
{
cout << "programm running" << endl;
int i;
cin >> i;
ReleaseMutex(mut);
}
else
cout << "fail programm running" << endl;
CloseHandle(mut);
}
Добавлено через 6 минут
C++
1
2
3
4
5
HANDLE hMutex = ::CreateMutex(NULL, TRUE, MY_MUTEX_NAME);
(LPSECURITY_ATTRIBUTES lpMutexAttributes,// атрибут безопастности
BOOL bInitialOwner,// флаг начального владельца
LPCTSTR lpName// имя объекта
);
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
21.09.2013, 16:05     Списки контроля доступа Access Control List (ACL) #16
Цитата Сообщение от MrWoolf Посмотреть сообщение
Я уже начинаю путаться
Значит, пора отдыхать.
Или перечитать еще раз соответствующие статьи, главы и т.п.

Цитата Сообщение от MrWoolf Посмотреть сообщение
HANDLE hMutex = ::CreateMutex(NULL, TRUE, MY_MUTEX_NAME);
(LPSECURITY_ATTRIBUTES lpMutexAttributes,// атрибут безопастности
BOOL bInitialOwner,// флаг начального владельца
LPCTSTR lpName// имя объекта
);
Это что вообще такое ?
У Вас же был на 99% готовый код с установкой дескриптора безопасности для мьютекса.
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
22.09.2013, 13:07  [ТС]     Списки контроля доступа Access Control List (ACL) #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 минут
Товарищи подскажите что дальше делать...?
Убежденный
Системный программист
 Аватар для Убежденный
14183 / 6198 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
22.09.2013, 13:36     Списки контроля доступа Access Control List (ACL) #18
Цитата Сообщение от MrWoolf Посмотреть сообщение
мне нужно определить
1. SECURITY_ATTRIBUTES для мьютекса
Сурово...
Я отвечал на этот вопрос уже три раза.

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

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

P.S. Отписался от темы.
MrWoolf
3 / 1 / 0
Регистрация: 29.11.2012
Сообщений: 60
22.09.2013, 15:42  [ТС]     Списки контроля доступа Access Control List (ACL) #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);
да конечно, на язык все грамотны а показать на примере или помоч... так сразу не кого... спасибо я в книге могу тоже самое прочесть...
этот форум был создан для того чтоб книги советовать или помогать людям??
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 16:01     Списки контроля доступа Access Control List (ACL)
Еще ссылки по теме:

Реализация std::list, сложность list::size() C++
C++ Преобразование списка list в *list
Списки, как склеить списки между собой? C++

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

Или воспользуйтесь поиском по форуму:
alsav22
22.09.2013, 16:01     Списки контроля доступа Access Control List (ACL)
  #20

Не по теме:

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

Yandex
Объявления
22.09.2013, 16:01     Списки контроля доступа Access Control List (ACL)
Ответ Создать тему
Опции темы

Текущее время: 00:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru