powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / mailslot создан приложением запущенным под System, клиент запущен под user
4 сообщений из 4, страница 1 из 1
mailslot создан приложением запущенным под System, клиент запущен под user
    #39096903
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грубо, есть "сервис", т.е. App1 - запущен под System
В App1 создан mailslot:
Код: plaintext
1.
2.
3.
4.
    hSlot = CreateMailslot(lpszSlotName, 
        0,                             // no maximum message size 
        0, 
        (LPSECURITY_ATTRIBUTES) NULL); // default security




App2 запущено под 'User' и пытается положить сообщение в этот mailslot

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   hFile = CreateFile(SlotName, 
     GENERIC_WRITE, 
     FILE_SHARE_READ,
     (LPSECURITY_ATTRIBUTES) NULL, 
     OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL, 
     (HANDLE) NULL); 
 
   if (hFile == INVALID_HANDLE_VALUE) 
   { 



Дык вот в этой ситуации (Send(из под user) -> mailslot(под System) ) не работает.
hFile возвращает INVALID_HANDLE_VALUE, т.е. -1
Хотя mailslot точно запущен и с ним все OK (т.е. он получает сообщения от других App кот. запущены под System)

В коде ошибок нет, т.е. та же комбинация работает если:
Send(из под user) -> mailslot( под user )

Ну и аналогичные взаимодействия у меня работают в комбинациях:
Send(из под System) -> mailslot(под System)
Send(из под System) -> mailslot(под User)

Я подозреваю, что надо что-то поменять в LPSECURITY_ATTRIBUTES в CreateMailslot
Т.е. мне надо чтоб mailslot под System был видим и принимал сообщения грубо от любого User.
Есть идеи?

P.S. На самом деле у меня вся эта кухня большей частью на VB, но это API, куски кодов для объяснения вопроса привел на C с сохранением используемых флагов.
...
Рейтинг: 0 / 0
mailslot создан приложением запущенным под System, клиент запущен под user
    #39096908
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первая же ссылка в гугле:
https://code.msdn.microsoft.com/windowsapps/CSMailslotCommunication-ec2a9639

The ACLs in the default security descriptor of a mailslot grant full
control
to the LocalSystem account, (elevated) dministrators, and the creator
owner
. They also give only read access to members of the Everyone group and
the anonymous
account.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
mailslot создан приложением запущенным под System, клиент запущен под user
    #39096938
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну я понял.
В приведенном тобой примере C#, понятно что обертка над API, но надо копаться.
А на C/C++ примера нет, как эту LPSECURITY_ATTRIBUTES сформировать.
Но судя по всему это очередной довольно таки тяжелый код.

И еще.
У меня на вооружении есть такая ф-ция:

Код: vbnet
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.
  Public Function DoFullAccessFileFolder(ByVal FileFolderPath As String) As Integer
    DoFullAccessFileFolder = AddAceToObjectsSecurityDescriptor(FileFolderPath, _
     SE_OBJECT_TYPE.SE_FILE_OBJECT, _
     ConstructUniversalAndNTWellKnownSids("Users"), _
     GENERIC_ALL, _
     ACCESS_MODE.GRANT_ACCESS, _
     CONTAINER_INHERIT_ACE Or OBJECT_INHERIT_ACE)
    If DoFullAccessFileFolder <> ERROR_SUCCESS Then
      AddLog("  Calling AddAceToObjectsSecurityDescriptor... Failed. Error code: " & RaiseAPIErrorByNumber(DoFullAccessFileFolder))
    Else
      AddLog("  Calling AddAceToObjectsSecurityDescriptor... Done.")
    End If
  End Function


  Public Function AddAceToObjectsSecurityDescriptor(pszObjName As String, _
   ObjectType As SE_OBJECT_TYPE, pszTrustee As String, _
   dwAccessRights As Integer, AccessMode As ACCESS_MODE, dwInheritance As Integer) As Integer
    'DWORD AddAceToObjectsSecurityDescriptor (
    '    LPTSTR pszObjName,          ' name of object
    '    SE_OBJECT_TYPE ObjectType,  ' type of object
    '    LPTSTR pszTrustee,          ' trustee for new ACE
    '    TRUSTEE_FORM TrusteeForm,   ' format of trustee structure -<не надо
    '    DWORD dwAccessRights,       ' access mask for new ACE
    '    ACCESS_MODE AccessMode,     ' type of ACE
    '    DWORD dwInheritance         ' inheritance flags for new ACE
    ')

    Dim dwRes As Integer
    Dim pOldDACL As IntPtr, pNewDACL As IntPtr
    Dim pSD As IntPtr
    Dim ea As New EXPLICIT_ACCESS

    If (pszObjName = "") Then
      AddAceToObjectsSecurityDescriptor = ERROR_INVALID_PARAMETER
      Exit Function
    End If

    'Get a pointer to the existing DACL.
    dwRes = GetNamedSecurityInfo(pszObjName, ObjectType, _
     DACL_SECURITY_INFORMATION, _
     IntPtr.Zero, IntPtr.Zero, pOldDACL, IntPtr.Zero, pSD)
    If dwRes <> ERROR_SUCCESS Then
      AddLog("    Calling GetNamedSecurityInfo... Failed. Error code: " & RaiseAPIErrorByNumber(dwRes))
      'MsgBox "GetNamedSecurityInfo Error " & CStr(dwRes)
      GoTo Cleanup
    Else
      AddLog("    Calling GetNamedSecurityInfo... Done.")
    End If

    'Initialize an EXPLICIT_ACCESS structure for the new ACE.
    'BuildExplicitAccessWithName(ea, pszTrustee, dwAccessRights, AccessMode, dwInheritance)
    '-по каким-то причинам эта ф-ция вызывает crash
    'поэтому инициализируем ea-структуру вручную согласно описанию ф-ции
    'pTrusteeName-A pointer to a null-terminated string that contains the name of the trustee for the ptstrName member of the TRUSTEE structure.
    'The BuildExplicitAccessWithName function sets the other members of the TRUSTEE structure as follows.
    'pMultipleTrustee    NULL
    'MultipleTrusteeOperation    NO_MULTIPLE_TRUSTEE
    'TrusteeForm    TRUSTEE_IS_NAME
    'TrusteeType    TRUSTEE_IS_UNKNOWN
    With ea
      .grfAccessPermissions = dwAccessRights
      .grfAccessMode = AccessMode
      .grfInheritance = dwInheritance
      .pTrustee.pMultipleTrustee = IntPtr.Zero
      .pTrustee.MultipleTrusteeOperation = MULTIPLE_TRUSTEE_OPERATION.NO_MULTIPLE_TRUSTEE
      ea.pTrustee.TrusteeForm = TRUSTEE_FORM.TRUSTEE_IS_NAME
      ea.pTrustee.TrusteeType = TRUSTEE_TYPE.TRUSTEE_IS_UNKNOWN
      ea.pTrustee.ptstrName = pszTrustee
    End With

    ' Create a new ACL that merges the new ACE into the existing DACL.
    dwRes = SetEntriesInAcl(1, ea, pOldDACL, pNewDACL)
    If dwRes <> ERROR_SUCCESS Then
      AddLog("    Calling SetEntriesInAcl... Failed. Error code: " & RaiseAPIErrorByNumber(dwRes))
      'MsgBox "SetEntriesInAcl Error " & CStr(dwRes)
      GoTo Cleanup
    Else
      AddLog("    Calling SetEntriesInAcl... Done.")
    End If

    'Attach the new ACL as the object's DACL.
    dwRes = SetNamedSecurityInfo(pszObjName, ObjectType, _
     DACL_SECURITY_INFORMATION, _
     IntPtr.Zero, IntPtr.Zero, pNewDACL, IntPtr.Zero)
    If dwRes <> ERROR_SUCCESS Then
      AddLog("    Calling SetNamedSecurityInfo... Failed. Error code: " & RaiseAPIErrorByNumber(dwRes))
      'MsgBox "SetNamedSecurityInfo Error " & CStr(dwRes)
      GoTo Cleanup
    Else
      AddLog("    Calling SetNamedSecurityInfo... Done.")
    End If

Cleanup:
    If pSD <> IntPtr.Zero Then LocalFree(pSD)
    If pNewDACL <> IntPtr.Zero Then LocalFree(pNewDACL)

    AddAceToObjectsSecurityDescriptor = dwRes
  End Function



При запуске из-под admin (а System это тоже admin так понимаю, блин давно с этим копался)
устанавливает full access к файлу или папке.

Нельзя скажем создать mailslot с дефолтом LPSECURITY_ATTRIBUTES) NULL дабы не возиться,
а потом бабахнуть
Код: vbnet
1.
DoFullAccessFileFolder ("\\.\mailslot\MailSlotName")

??

mailslot это ж вроде типа "файл".

...Но на дурака не прокатило, уже попробовал.


Или надо готовить LPSECURITY_ATTRIBUTES именно при создании?
И если приложение создающее mailslot запущено под System, оно не нарвется на Access Denined (err.5 кажется) когда будет делать эти установки?
...
Рейтинг: 0 / 0
mailslot создан приложением запущенным под System, клиент запущен под user
    #39097095
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

А впрочем спасибо за код. У меня все получилось ( сорри за VB код ):

Код: vbnet
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.
    MakeMailSlot("\\.\mailslot\MailSlotName", False, True)


 Public Function MakeMailSlot(ByVal lpszSlotName As String, _
   Optional ByVal WaitForever As Boolean = False, _
   Optional ByVal FullAccess As Boolean = False) As Boolean
    'ПРИЕМНИК(сервер) ф-ция создает MailSlot с именем lpszSlotName
    'невозможно создать более одного MailSlot с заданным именем
    Dim m_tSA As SECURITY_ATTRIBUTES
    If FullAccess Then m_tSA = CreateMailslotSecurityFullAccess()

    If Strings.Len(lpszSlotName) = 0 Then
      ' No slotname
      hMailSlotHandle = INVALID_HANDLE_VALUE
      MakeMailSlot = False
      Exit Function
    End If

    ' The handle to the slot
    hMailSlotHandle = CreateMailslot(lpszSlotName, 0, IIf(WaitForever, MAILSLOT_WAIT_FOREVER, 0), m_tSA)

    MakeMailSlot = (hMailSlotHandle <> INVALID_HANDLE_VALUE)
  End Function

  Public Const SDDL_REVISION_1 = 1

  Public Declare Unicode Function ConvertStringSecurityDescriptorToSecurityDescriptor Lib "advapi32.dll" _
   Alias "ConvertStringSecurityDescriptorToSecurityDescriptorW" ( _
   ByVal StringSecurityDescriptor As String, _
   ByVal StringSDRevision As Integer, _
   ByRef SecurityDescriptor As IntPtr,
   ByVal SecurityDescriptorSize As IntPtr) As Boolean

  Public Function CreateMailslotSecurityFullAccess() As SECURITY_ATTRIBUTES
    ' Define the SDDL for the security descriptor. 
    'DACL + OBJECT_INHERIT_ACE/CONTAINER_INHERIT_ACE + GENERIC_ALL (полный доступ) + SECURITY_WORLD_RID (группа "EveryOne")
    Dim sddl As String = "D:(A;OICI;GA;;;WD)"

    Dim pSecurityDescriptor As IntPtr
    Dim sa As New SECURITY_ATTRIBUTES
    If ConvertStringSecurityDescriptorToSecurityDescriptor(sddl, SDDL_REVISION_1, pSecurityDescriptor, IntPtr.Zero) Then
      sa.nLength = Marshal.SizeOf(sa)
      sa.lpSecurityDescriptor = pSecurityDescriptor
      sa.bInheritHandle = False
    End If

    Return sa
  End Function



Единственное, сначала глядя сюда:
SID Strings

пытался делать

Код: vbnet
1.
2.
    ' "DU" SDDL_DOMAIN_USERS Domain users. The corresponding RID is DOMAIN_GROUP_RID_USERS.
    Dim sddl As String = "D:(A;OICI;GA;;;DU)"


Но оно мне отрубило доступ к mailslot из-под самого System.

Потом таки доперло сделать "EveryOne" вместо "Пользователи":
Код: vbnet
1.
2.
    ' "WD" SDDL_EVERYONE Everyone. The corresponding RID is SECURITY_WORLD_RID.
    Dim sddl As String = "D:(A;OICI;GA;;;WD)"



Т.е. мне надо
1) mailslot может запускаться под User либо под System
2) в случае, если запущен под System, сообщения туда могут класть и User, и сама System
"EveryOne"+GA(полный доступ) сойдет для снятия всех ограничений на запись?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / mailslot создан приложением запущенным под System, клиент запущен под user
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]