powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
60 сообщений из 60, показаны все 3 страниц
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842344
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например:
Есть ветка реестра
Надо понять, есть ли у пользователя (пусть будет администратор) определенные права скажем на удаление/модификацию ключей
Надо понять, является ли пользователь владельцем этой ветки
Надо уметь сменить владельца
Надо уметь сменить права
ну и т.д.

На API я все это делал месяца 3 назад - еще свежо.
Есть .Net классы?

Кой-чего начал копать, напр. могу узнать администратор ли пользователь:
Код: vbnet
1.
2.
3.
  Public Function IsAdministrator() As Boolean
    Return New WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)
  End Function



Ну, если с этим тоже фигово, передеру API-вариант.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842348
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мыши плакали, кололись, но продолжали грызть кактус
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842369
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
хорош язвить.
Пример, чтоб было понятнее о чем речь:
15846991
Ты уже наверно понял, что если мне чего-то надо, то я всегда догрызаю до победного. А мне надо.
Так что там .Net об этом думает?
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842373
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ты уже наверно понял, что если мне чего-то надо, то я всегда догрызаю до победного. А мне надо.

Читай от корки до корки:

http://msdn.microsoft.com/ru-ru/library/ms229742(v=vs.110).aspx
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842380
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Дмитрий77Так что там .Net об этом думает?
net думает, что у него есть managed c++
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842396
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЧитай от корки до корки:

http://msdn.microsoft.com/ru-ru/library/ms229742(v=vs.110).aspx
OK,
System.Security.AccessControl

А про смену владельца есть где?

!!!VB6
Код: 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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
'http://support.microsoft.com/kb/218965/ru
'http://msdn.microsoft.com/en-us/library/windows/desktop/aa446629(v=vs.85).aspx

Public Function GetSecurityOwner(ByVal pszObjName As String, _
 ByVal ObjectType As SE_OBJECT_TYPE, _
 ByRef AcctName As String, ByRef DomainName As String) As Long
  'ф-ция возвращает владельца объекта
  
  'AcctName - account name, DomainName - domain name
  Dim dwRes As Long
  Dim pSidOwner As Long 'security identifier
  Dim pSD As Long
  Dim bRtnBool As Long
  Dim dwAcctName As Long 'size of account name buffer
  Dim dwDomainName As Long 'size of domain name buffer
  Dim eUse As Integer 'SID type
 
  If (pszObjName = "") Then
    GetSecurityOwner = ERROR_INVALID_PARAMETER
    'Debug.Print "ERROR_INVALID_PARAMETER"
    Exit Function
  End If
  
  'Get a pointer to the owner SID of the file
  dwRes = GetNamedSecurityInfo(pszObjName, ObjectType, _
   OWNER_SECURITY_INFORMATION, _
   pSidOwner, 0&, 0&, 0&, pSD)
  If dwRes <> ERROR_SUCCESS Then
    'Debug.Print "GetNamedSecurityInfo Error " & CStr(dwRes)
    GoTo Cleanup
  End If
  
  'First call to LookupAccountSid to get the buffer sizes.
  bRtnBool = LookupAccountSid(vbNullString, pSidOwner, AcctName, dwAcctName, _
   DomainName, dwDomainName, eUse)
  If (bRtnBool = 0) And (Err.LastDllError <> ERROR_INSUFFICIENT_BUFFER) Then
    'Debug.Print "LookupAccountSid (1) Error " & Err.LastDllError
    dwRes = Err.LastDllError
    GoTo Cleanup
  End If
  
  'Allocate the required space in the AcctName and DomainName string
  'variables. Allocate 1 byte less to avoid the appended NULL character.
  AcctName = Space(dwAcctName - 1)
  DomainName = Space(dwDomainName - 1)
  
  'Second call to LookupAccountSid to get the account name.
  bRtnBool = LookupAccountSid(vbNullString, pSidOwner, AcctName, dwAcctName, _
   DomainName, dwDomainName, eUse)
  If bRtnBool = 0 Then
    'Debug.Print "LookupAccountSid (2) Error " & Err.LastDllError
    dwRes = Err.LastDllError
    GoTo Cleanup
  End If

Cleanup:
  If pSD <> 0 Then LocalFree pSD
  
  GetSecurityOwner = dwRes
  
End Function

'Enabling and Disabling Privileges in C++
'http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619(v=vs.85).aspx
Public Function SetPrivilege( _
 ByVal hToken As Long, _
 ByVal lpszPrivilege As String, _
 ByVal bEnablePrivilege As Boolean) As Long
  ' hToken - access token handle
  ' lpszPrivilege - name of privilege to enable/disable
  ' bEnablePrivilege - to enable or disable privilege
  
  Dim bRtnBool As Long
  Dim tP As TOKEN_PRIVILEGES
  Dim New_tp As TOKEN_PRIVILEGES
  Dim mLUID As LUID
  bRtnBool = LookupPrivilegeValue("", lpszPrivilege, mLUID)
  If bRtnBool = 0 Then
    'Debug.Print "LookupPrivilegeValue Error " & Err.LastDllError
    SetPrivilege = Err.LastDllError
    Exit Function
  End If
  
  tP.PrivilegeCount = 1
  tP.Privileges(0).pLuid = mLUID
  If bEnablePrivilege Then
    tP.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
  Else
    tP.Privileges(0).Attributes = 0
  End If
  bRtnBool = AdjustTokenPrivileges(hToken, False, tP, 4 + (12 * tP.PrivilegeCount), _
   New_tp, 4 + (12 * New_tp.PrivilegeCount))
  If bRtnBool = 0 Then
    'Debug.Print "AdjustTokenPrivileges Error " & Err.LastDllError
    SetPrivilege = Err.LastDllError
    Exit Function
  End If
  
  If Err.LastDllError = ERROR_NOT_ALL_ASSIGNED Then
    'Debug.Print "AdjustTokenPrivileges Error " & Err.LastDllError
    SetPrivilege = Err.LastDllError
    Exit Function
  End If
  
  'при успехе эта ф-ция вернет 0
End Function

'Taking Object Ownership in C++
'http://msdn.microsoft.com/en-us/library/windows/desktop/aa379620(v=vs.85).aspx
Public Function SetSecurityOwnerAdmins(ByVal pszObjName As String, _
 ByVal ObjectType As SE_OBJECT_TYPE) As Long
  'назначает группу "Administrators" владельцем объекта
  
  'AcctName - account name, DomainName - domain name
  Dim dwRes As Long
  Dim hToken As Long
  Dim pSIDAdmin As Long
  Dim bRtnBool As Long
 
  If (pszObjName = "") Then
    SetSecurityOwnerAdmins = ERROR_INVALID_PARAMETER
    'Debug.Print "ERROR_INVALID_PARAMETER"
    Exit Function
  End If
  
  'Create a SID for the BUILTIN\Administrators group.
  Dim siaNtAuthority As SID_IDENTIFIER_AUTHORITY
  
  siaNtAuthority.Value(5) = SECURITY_NT_AUTHORITY
  bRtnBool = AllocateAndInitializeSid(siaNtAuthority, 2, _
   SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, _
   0, 0, 0, 0, 0, 0, pSIDAdmin)
  If bRtnBool = 0 Then
    'Debug.Print "AllocateAndInitializeSid Error " & Err.LastDllError
    dwRes = Err.LastDllError
    GoTo Cleanup
  End If
  
  'If the preceding call failed because access was denied,
  'enable the SE_TAKE_OWNERSHIP_NAME privilege, create a SID for
  'the Administrators group, take ownership of the object, and
  'disable the privilege. Then try again to set the object's DACL.

  ' Open a handle to the access token for the calling process.
  bRtnBool = OpenProcessToken(GetCurrentProcess(), _
                          TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
                          hToken)
  If bRtnBool = 0 Then
    'Debug.Print "OpenProcessToken Error " & Err.LastDllError
    dwRes = Err.LastDllError
    GoTo Cleanup
  End If

  'Enable the SE_TAKE_OWNERSHIP_NAME privilege.
  dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, True)
  If dwRes <> 0 Then
    'Debug.Print "SetPrivilege (1) Error " & dwRes
    GoTo Cleanup
  End If
  
  'Set the owner in the object's security descriptor.
  dwRes = SetNamedSecurityInfo(pszObjName, ObjectType, _
   OWNER_SECURITY_INFORMATION, _
   pSIDAdmin, 0&, 0&, 0&)
  If dwRes <> ERROR_SUCCESS Then
    'Debug.Print "SetNamedSecurityInfo Error " & CStr(dwRes)
    GoTo Cleanup
  End If
        
  'Disable the SE_TAKE_OWNERSHIP_NAME privilege.
  dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, False)
  If dwRes <> 0 Then
    'Debug.Print "SetPrivilege (2) Error " & dwRes
    GoTo Cleanup
  End If
  
Cleanup:
  If pSIDAdmin <> 0 Then FreeSid pSIDAdmin
  If hToken <> 0 Then CloseHandle hToken

  SetSecurityOwnerAdmins = dwRes
  
End Function

'Taking Object Ownership in C++
'http://msdn.microsoft.com/en-us/library/windows/desktop/aa379620(v=vs.85).aspx
Public Function SetSecurityOwner(ByVal pszObjName As String, _
 ByVal ObjectType As SE_OBJECT_TYPE, _
 ByVal AcctName As String, Optional ByVal DomnName As String = "") As Long
  'назначает группу/аккаунт [DomnName + '\' +] AcctName владельцем объекта (по читаемому имени)
 
  'AcctName - account name, DomnName - domain name
  Dim AccountName As String 'на вход DomnName + '\' + AcctName
  
  Dim dwRes As Long
  Dim hToken As Long
  Dim p_abytSIDTarget() As Byte 'вместо pSIDTarget
  Dim dwSIDTarget As Long 'size of the Sid buffer
  Dim DomainName As String 'domain name на выходе
  Dim dwDomainName As Long 'size of domain name buffer
  Dim eUse As Integer 'SID type
  Dim bRtnBool As Long
 
  If (pszObjName = "") Then
    SetSecurityOwner = ERROR_INVALID_PARAMETER
    'Debug.Print "ERROR_INVALID_PARAMETER"
    Exit Function
  End If
  
  'Create a SID for specified account
  If Len(DomnName) > 0 Then
    AccountName = DomnName & "\" & AcctName
  Else
    AccountName = AcctName
  End If
  'Preinitialize p_abytSIDAdmin array with one element. It will be redimmed lated
  ReDim p_abytSIDTarget(1) As Byte
  'First call to LookupAccountName to get the buffer sizes.
  bRtnBool = LookupAccountName(vbNullString, AccountName, p_abytSIDTarget(0), dwSIDTarget, _
   DomainName, dwDomainName, eUse)
  If (bRtnBool = 0) And (Err.LastDllError <> ERROR_INSUFFICIENT_BUFFER) Then
    'Debug.Print "LookupAccountName (1) Error " & Err.LastDllError
    dwRes = Err.LastDllError
    GoTo Cleanup
  End If
  
  'Debug.Print "dwSIDTarget=" & dwSIDTarget & vbCrLf & "dwDomainName=" & dwDomainName
  
  'Allocate the required space in the p_abytSIDAdmin and DomainName string
  'variables. Allocate 1 byte less to avoid the appended NULL character.
  ReDim p_abytSIDTarget(dwSIDTarget) As Byte
  DomainName = Space(dwDomainName - 1)

  'Second call to LookupAccountName to get p_abytSIDAdmin.
  bRtnBool = LookupAccountName(vbNullString, AccountName, p_abytSIDTarget(0), dwSIDTarget, _
   DomainName, dwDomainName, eUse)
  If bRtnBool = 0 Then
    'Debug.Print "LookupAccountName (2) Error " & Err.LastDllError
    dwRes = Err.LastDllError
    GoTo Cleanup
  End If
  
  'Debug.Print DomainName
  
  'If the preceding call failed because access was denied,
  'enable the SE_TAKE_OWNERSHIP_NAME privilege, create a SID for
  'Target group, take ownership of the object, and
  'disable the privilege. Then try again to set the object's DACL.

  ' Open a handle to the access token for the calling process.
  bRtnBool = OpenProcessToken(GetCurrentProcess(), _
                          TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
                          hToken)
  If bRtnBool = 0 Then
    'Debug.Print "OpenProcessToken Error " & Err.LastDllError
    dwRes = Err.LastDllError
    GoTo Cleanup
  End If

  'Enable the SE_TAKE_OWNERSHIP_NAME privilege.
  dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, True)
  If dwRes <> 0 Then
    'Debug.Print "SetPrivilege (1) Error " & dwRes
    GoTo Cleanup
  End If

  'Enable the SE_RESTORE_NAME privilege.
  dwRes = SetPrivilege(hToken, SE_RESTORE_NAME, True)
  If dwRes <> 0 Then
    'Debug.Print "SetPrivilege (2) Error " & dwRes
    GoTo Cleanup
  End If
  
  'Set the owner in the object's security descriptor.
  dwRes = SetNamedSecurityInfo(pszObjName, ObjectType, _
   OWNER_SECURITY_INFORMATION, _
   VarPtr(p_abytSIDTarget(0)), 0&, 0&, 0&)
  If dwRes <> ERROR_SUCCESS Then
    'Debug.Print "SetNamedSecurityInfo Error " & CStr(dwRes)
    GoTo Cleanup
  End If
        
  'Disable the SE_TAKE_OWNERSHIP_NAME privilege.
  dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, False)
  If dwRes <> 0 Then
    'Debug.Print "SetPrivilege (3) Error " & dwRes
    GoTo Cleanup
  End If

  'Disable the SE_RESTORE_NAME privilege.
  dwRes = SetPrivilege(hToken, SE_RESTORE_NAME, False)
  If dwRes <> 0 Then
    'Debug.Print "SetPrivilege (4) Error " & dwRes
    GoTo Cleanup
  End If
  
Cleanup:
  If hToken <> 0 Then CloseHandle hToken

  SetSecurityOwner = dwRes
  
End Function

Public Function GetFileFolderOwner(ByVal FileFolderPath As String, _
 ByRef AcctName As String, ByRef DomainName As String) As Long
  'возвращает владельца папки или файла
  GetFileFolderOwner = GetSecurityOwner(FileFolderPath, _
   SE_FILE_OBJECT, _
   AcctName, _
   DomainName)
End Function

Public Function GetRegistryEntryOwner(ByVal RegistryPath As String, _
 ByRef AcctName As String, ByRef DomainName As String) As Long
  'возвращает владельца ветки реестра
  GetRegistryEntryOwner = GetSecurityOwner(RegistryPath, _
   SE_REGISTRY_KEY, _
   AcctName, _
   DomainName)
End Function

...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842408
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилnet думает, что у него есть managed c++
А скажи мне, как я подключу C++ если у меня проект VB.Net и все GUI на VB.Net и осваивать managed c++ как таковое я не хочу. Хотя API лучше на C++ кто б спорил.
И я использую Express. Лицензия - дорого, а искать крякнутые студии - в этом вопросе я на это не пойду.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842427
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

...уж не является ли ваш проект заменой Панели управления Windows, случайно? ... не язвлю, честно интересно ...
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842432
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77И я использую Express.
Community Edition почему не используешь?
Дмитрий77А скажи мне, как я подключу C++ если у меня проект VB.Net и все GUI на VB.Net
легко - один из проектов в солюшне на C++

managed с++ - тож не сахар, на мой взгляд адаптеры для API лучше нв обычном c++ а с .net кодом взаимодействовать через свой внятный p/invoke или свой COM интерфейс с внятными параметрами
IDispatch в конце концов

Если и дальше собираешься воевать с p/invoke - обрати внимание на ICustomMarshaler, с ним любые проблемы интеропа решаемы, но адаптер на С++ пишется быстрее
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842496
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
carrotikДмитрий77,

...уж не является ли ваш проект заменой Панели управления Windows, случайно? ... не язвлю, честно интересно ...
Нет, не является. Но техническая часть достаточно сложна. Т.е. мне необходимо конфигурировать виртуальные порты, модемы, есть виртуальный принтер, может запускаться как служба. И как понимаешь должен работать под обычным пользователем, а какие-то вещи конфигурируются только администратором, отсюда необходимось работать с правами и т.п. о чем я здесь спрашиваю.

Изопропил,
ну в принципе написать любой API-код на VB(6/Net) для меня не является проблемой.
Ну т.е. C++ мне для этого не нужен.

Опять же, если есть нормальный .Net класс, предпочту его а не API.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842501
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Опять же, если есть нормальный .Net класс
ну так не покрывается WinApi .net классами

время, потраченное на битву с интероп, куда полезнее можно было использовать на освоение C++
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842518
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77Опять же, если есть нормальный .Net класс
ну так не покрывается WinApi .net классами

время, потраченное на битву с интероп, куда полезнее можно было использовать на освоение C++
Я же написал "если есть".
А время уже и так потрачено когда писал на VB6. Переписать на VB.Net много времени не занимает. С IntPtr/Integer вроде разобрались.
Я умею писать это на C++ но у меня проект VB, и я к VB привык.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842550
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77но у меня проект VB
замени проект на solution и комбинируй хоть с питоном
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38842575
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А про смену владельца есть где?
Для файловой системы:
FileSystemSecurity Class (System.Security.AccessControl)
FileSystemAccessRule Class (System.Security.AccessControl)
для реестра по аналогии:
RegistrySecurity Class (System.Security.AccessControl)
RegistryAccessRule Class (System.Security.AccessControl)
смена прав:
ObjectSecurity.ModifyAccessRule Method (System.Security.AccessControl)
до кучи ко всему вышеперчисленному советую прочитать вот это: Manage Access to Windows Objects with ACLs and the .NET Framework
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38843719
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогайте,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  Private Sub ButtonCheckModify_Click(sender As Object, e As EventArgs) Handles ButtonCheckModify.Click
    Dim acc As NTAccount = New NTAccount("Администраторы")
    Dim secId As SecurityIdentifier = acc.Translate(GetType(SecurityIdentifier))
    Dim rk As RegistryKey = Registry.ClassesRoot.OpenSubKey("AppID\{AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0}", _
     RegistryKeyPermissionCheck.ReadSubTree, Security.AccessControl.RegistryRights.ReadPermissions)
    Dim mSec As New RegistrySecurity
    mSec = rk.GetAccessControl()
    'MsgBox(mSec.GetOwner(GetType(NTAccount)).ToString)
    Dim rules As AuthorizationRuleCollection = mSec.GetAccessRules(True, True, GetType(NTAccount))
    For Each Rule As RegistryAccessRule In rules
      Debug.Print(Rule.IdentityReference.Value & " " & Rule.RegistryRights.ToString)
      Мне нужно правило соответствующее "Администраторы"!!!
      Мне нужно пока понять есть ли в этом правиле флаг SetValue (KEY_SET_VALUE) ДА/НЕТ
    Next
  End Sub


Судя по выводу дебага куда надо я попал:
Код: vbnet
1.
2.
3.
4.
5.
NT AUTHORITY\СИСТЕМА ReadKey
BUILTIN\Администраторы ReadKey
BUILTIN\Пользователи ReadKey
NT SERVICE\TrustedInstaller FullControl
ЦЕНТР ПАКЕТОВ ПРИЛОЖЕНИЙ\ВСЕ ПАКЕТЫ ПРИЛОЖЕНИЙ ReadKey
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38843751
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Мне нужно пока понять есть ли в этом правиле флаг SetValue (KEY_SET_VALUE) ДА/НЕТ

Ну видимо

Код: vbnet
1.
2.
3.
    For Each Rule As RegistryAccessRule In rules
      Debug.Print(Rule.IdentityReference.Value & " " & ((Rule.RegistryRights Or RegistryRights.SetValue) = Rule.RegistryRights))
    Next


А вот как уточняется что это правило именно для "Администраторы" (не визуальным сравнением Rule.IdentityReference.Value надо думать)
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38843950
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну как-то так:

Код: 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.
  Public Function RegistryEntry_QuerySetValueAdmins(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByRef AllowSetValue As Boolean) As Boolean
    'ф-ция выясняет, имеют ли администраторы право SetValue (KEY_SET_VALUE) для ветки реестра
    'ф-ция возвращает true при успехе определения искомого
    'ф-ция возвращает результат в AllowSetValue (при успехе)
    Dim adminSid As SecurityIdentifier = New SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing)
    Dim rk As RegistryKey = Key.OpenSubKey _
     (SubKey, RegistryKeyPermissionCheck.ReadSubTree, Security.AccessControl.RegistryRights.ReadPermissions)
    For Each rule As RegistryAccessRule In _
     rk.GetAccessControl().GetAccessRules(True, True, GetType(SecurityIdentifier))
      If rule.IdentityReference.Equals(adminSid) Then
        AllowSetValue = ((rule.RegistryRights Or RegistryRights.SetValue) = rule.RegistryRights)
        Return True
      End If
    Next
    Return False
  End Function

  Private Sub ButtonCheckModify_Click(sender As Object, e As EventArgs) Handles ButtonCheckModify.Click
    Dim bSuccess As Boolean
    MsgBox(RegistryEntry_QuerySetValueAdmins _
     (Registry.ClassesRoot, "AppID\{AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0}", bSuccess))
    MsgBox("Allow SetValue=" & bSuccess)
  End Sub



Ну вот не пойму.
Код вроде короче, и обертка вроде есть.
Но она чуть ли не запутанней чем API, или я не привык просто.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844061
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владельца получить могу:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  Public Function GetRegistryEntryOwner(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByRef OwnerName As String) As Boolean
    'возвращает владельца ветки реестра
    Try
      Dim rk As RegistryKey = Key.OpenSubKey _
       (SubKey, RegistryKeyPermissionCheck.ReadSubTree, Security.AccessControl.RegistryRights.ReadPermissions)
      OwnerName = rk.GetAccessControl().GetOwner(GetType(NTAccount)).Value
      Return True
    Catch
      Debug.Print(Err.Description)
      Return False
    End Try
  End Function



А вот заменить не получается (запускаю под админим естественно):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  Public Function SetRegistryEntryOwner(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal OwnerName As String) As Boolean
    'назначает владельца ветки реестра
    Try
      Dim rk As RegistryKey = Key.OpenSubKey _
       (SubKey, RegistryKeyPermissionCheck.ReadSubTree, Security.AccessControl.RegistryRights.TakeOwnership)
      Dim ac As RegistrySecurity = rk.GetAccessControl()
      ac.SetOwner(New NTAccount(OwnerName))
      rk.SetAccessControl(ac)
      Return True
    Catch
      Debug.Print(Err.Description)
      Return False
    End Try
  End Function


Спотыкается на строчке

Код: vbnet
1.
2.
3.
      Dim rk As RegistryKey = Key.OpenSubKey _
       (SubKey, RegistryKeyPermissionCheck.ReadSubTree, Security.AccessControl.RegistryRights.TakeOwnership)
Запрошенный доступ к реестру запрещен.



Через API я это делал:
17049769

Вот как это в .Net сделать, про какие-то токены речь идет:
Код: 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.
  'If the preceding call failed because access was denied,
  'enable the SE_TAKE_OWNERSHIP_NAME privilege, create a SID for
  'the Administrators group, take ownership of the object, and
  'disable the privilege. Then try again to set the object's DACL.

  ' Open a handle to the access token for the calling process.
  bRtnBool = OpenProcessToken(GetCurrentProcess(), _
                          TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
                          hToken)
  If bRtnBool = 0 Then
    'Debug.Print "OpenProcessToken Error " & Err.LastDllError
    dwRes = Err.LastDllError
    GoTo Cleanup
  End If

  'Enable the SE_TAKE_OWNERSHIP_NAME privilege.
  dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, True)
  If dwRes <> 0 Then
    'Debug.Print "SetPrivilege (1) Error " & dwRes
    GoTo Cleanup
  End If
  
  'Set the owner in the object's security descriptor.
  dwRes = SetNamedSecurityInfo(pszObjName, ObjectType, _
   OWNER_SECURITY_INFORMATION, _
   pSIDAdmin, 0&, 0&, 0&)
  If dwRes <> ERROR_SUCCESS Then
    'Debug.Print "SetNamedSecurityInfo Error " & CStr(dwRes)
    GoTo Cleanup
  End If
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844164
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил SE_TAKE_OWNERSHIP_NAME privilege для текущего процесса (через API, по идее должно было сработать).
В реестр пустил,
а rk.SetAccessControl(ac) делать все одно не хочет:
Необработанное исключение типа "System.UnauthorizedAccessException" в mscorlib.dll
Дополнительные сведения: Не удалось выполнить запись в раздел реестра.

У администратора нет прав на запись согласен.
Но сменить владельца администратор может.
Но .Net код этого делать не хочет. Или я не тот .Net код пишу и не так.
Реестр открыт с Security.AccessControl.RegistryRights.TakeOwnership

Код: 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.
 Public Function SetRegistryEntryOwner(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal OwnerName As String) As Boolean
    'назначает владельца ветки реестра
    Dim hToken As IntPtr
    Dim dwRes As Integer

    'If the preceding call failed because access was denied,
    'enable the SE_TAKE_OWNERSHIP_NAME privilege, create a SID for
    'the Administrators group, take ownership of the object, and
    'disable the privilege. Then try again to set the object's DACL.

    ' Open a handle to the access token for the calling process.
    If OpenProcessToken(Process.GetCurrentProcess().Handle, _
                            TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
                            hToken) = False Then
      Debug.Print("OpenProcessToken Error " & Err.LastDllError)
      Return False
    End If

    'Enable the SE_TAKE_OWNERSHIP_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, True)
    If dwRes <> 0 Then
      'Debug.Print "SetPrivilege (1) Error " & dwRes
      SetRegistryEntryOwner = False
      GoTo Cleanup
    End If

    'Try
    Dim rk As RegistryKey = Key.OpenSubKey _
     (SubKey, RegistryKeyPermissionCheck.Default, Security.AccessControl.RegistryRights.TakeOwnership)
    Dim ac As RegistrySecurity = rk.GetAccessControl()
    ac.SetOwner(New NTAccount(OwnerName))
    rk.SetAccessControl(ac) 'Не удалось выполнить запись в раздел реестра. 
    SetRegistryEntryOwner = True
    'Catch
    Debug.Print(Err.Description)
    SetRegistryEntryOwner = False
    'End Try

    'Disable the SE_TAKE_OWNERSHIP_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, False)
    If dwRes <> 0 Then
      'Debug.Print "SetPrivilege (2) Error " & dwRes
      GoTo Cleanup
    End If

Cleanup:
    If hToken <> IntPtr.Zero Then CloseHandle(hToken)

  End Function

  'Enabling and Disabling Privileges in C++
  'http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619(v=vs.85).aspx
  Public Function SetPrivilege( _
   ByVal hToken As IntPtr, _
   ByVal lpszPrivilege As String, _
   ByVal bEnablePrivilege As Boolean) As Integer
    ' hToken - access token handle
    ' lpszPrivilege - name of privilege to enable/disable
    ' bEnablePrivilege - to enable or disable privilege

    Dim tP As New TOKEN_PRIVILEGES
    Dim New_tp As New TOKEN_PRIVILEGES
    Dim mLUID As New LUID
    If LookupPrivilegeValue("", lpszPrivilege, mLUID) = False Then
      Debug.Print("LookupPrivilegeValue Error " & Err.LastDllError)
      SetPrivilege = Err.LastDllError
      Exit Function
    End If

    tP.PrivilegeCount = 1
    tP.pLuid = mLUID
    If bEnablePrivilege Then
      tP.Attributes = SE_PRIVILEGE_ENABLED
    Else
      tP.Attributes = 0
    End If
    If AdjustTokenPrivileges(hToken, False, tP, 4 + (12 * tP.PrivilegeCount), _
     New_tp, 4 + (12 * New_tp.PrivilegeCount)) = False Then
      Debug.Print("AdjustTokenPrivileges Error " & Err.LastDllError)
      SetPrivilege = Err.LastDllError
      Exit Function
    End If

    If Err.LastDllError = ERROR_NOT_ALL_ASSIGNED Then
      Debug.Print("AdjustTokenPrivileges Error " & Err.LastDllError)
      SetPrivilege = Err.LastDllError
      Exit Function
    End If

    'при успехе эта ф-ция вернет 0
    Return 0
  End Function

End Module
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844206
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Помогайте,

Будь добр, заведи у себя на рабочем столе текстовый файлик, и общайся там сам с собой. Не иби мозг.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844251
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Послушай, Уважаемый, или как тебя там.
Ты мне совет дал.
hVosttЧитай от корки до корки: http://msdn.microsoft.com/ru-ru/library/ms229742(v=vs.110).aspx
Я прочитал и попытался воспользоваться.
И в 2-х постах выше я подробно описал что конкретно у меня не получается.
При этом я в отличии от тебя не позволяю себе выражений типа "твоя технология - г*вно, а ты ...", а пытаюсь разобраться.
Знаешь - помоги разобраться. Не знаешь или не хочешь подсказать, не пиши ничего.
Меня если честно тоже за..бали общие рассуждения не относящиеся к темам топиков, при том что стоящих ответов по существу вопросов - 1%.

И будь добр , следи за своими высказываниями.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844259
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Меня если честно тоже за..бали общие рассуждения не относящиеся к темам топиков, при том что стоящих ответов по существу вопросов - 1%.

Ты перепутал личный блог с форумом. Задаёшь конкретный вопрос, получаешь конкретный ответ.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844268
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Нет, не перепутал. Я всегда задаю конкретные вопросы.

==
Крайний вопрос был следующий, готов переформулировать.

Есть ветка реестра. У нее Owner=Trusted Installer. У администратора права только на чтение.
Мне надо поменять Owner на Administrators.
Вот мой код (запущен из под администратора):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  Public Function SetRegistryEntryOwner(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal OwnerName As String) As Boolean
    'назначает владельца ветки реестра
    Try
      Dim rk As RegistryKey = Key.OpenSubKey _
       (SubKey, RegistryKeyPermissionCheck.ReadSubTree, Security.AccessControl.RegistryRights.TakeOwnership)
      Dim ac As RegistrySecurity = rk.GetAccessControl()
      ac.SetOwner(New NTAccount(OwnerName))
      rk.SetAccessControl(ac)
      Return True
    Catch
      Debug.Print(Err.Description)
      Return False
    End Try
  End Function


На выделенной строчке код спотыкается.
Ошибка: Запрошенный доступ к реестру запрещен.

Вопрос: Что не так в моем коде? Как сделать чтоб заработало? (как администратор я имею право поменять владельца объекта)
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844271
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Вопрос: Что не так в моем коде? Как сделать чтоб заработало? (как администратор я имею право поменять владельца объекта)
Так может тебе нужно запустить твой код трастово через Run As Admin?
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844279
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Так я же уточнил: >(запущен из под администратора):
И подробно описал, что я сделал дополнительно:
>Добавил SE_TAKE_OWNERSHIP_NAME privilege для текущего процесса (через API, по идее должно было сработать).
>В реестр пустил,
>а rk.SetAccessControl(ac) делать все одно не хочет:
>: Не удалось выполнить запись в раздел реестра.

Вот так работает:

Код: 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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
  Public Function SetRegistryEntryOwner(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal OwnerName As String) As Boolean
    'назначает владельца ветки реестра
    Dim hToken As IntPtr
    Dim dwRes As Integer
    Dim pSIDAdmin As IntPtr

    'Create a SID for the BUILTIN\Administrators group.
    Dim siaNtAuthority As SID_IDENTIFIER_AUTHORITY

    siaNtAuthority.Value = {0, 0, 0, 0, 0, SECURITY_NT_AUTHORITY}
    If AllocateAndInitializeSid(siaNtAuthority, 2, _
     SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, _
     0, 0, 0, 0, 0, 0, pSIDAdmin) = False Then
      'Debug.Print "AllocateAndInitializeSid Error " & Err.LastDllError
      Return False
    End If

    'If the preceding call failed because access was denied,
    'enable the SE_TAKE_OWNERSHIP_NAME privilege, create a SID for
    'the Administrators group, take ownership of the object, and
    'disable the privilege. Then try again to set the object's DACL.

    ' Open a handle to the access token for the calling process.
    If OpenProcessToken(Process.GetCurrentProcess().Handle, _
                            TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
                            hToken) = False Then
      Debug.Print("OpenProcessToken Error " & Err.LastDllError)
      Return False
    End If

    'Enable the SE_TAKE_OWNERSHIP_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, True)
    If dwRes <> 0 Then
      'Debug.Print "SetPrivilege (1) Error " & dwRes
      SetRegistryEntryOwner = False
      GoTo Cleanup
    End If

    'Set the owner in the object's security descriptor.
    dwRes = SetNamedSecurityInfo("CLASSES_ROOT\" & SubKey, SE_OBJECT_TYPE.SE_REGISTRY_KEY, _
     OWNER_SECURITY_INFORMATION, _
     pSIDAdmin, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero)
    If dwRes <> ERROR_SUCCESS Then
      'Debug.Print "SetNamedSecurityInfo Error " & CStr(dwRes)
      SetRegistryEntryOwner = False
      GoTo Cleanup
    Else
      SetRegistryEntryOwner = True
    End If


    'Try
    '  Dim rk As RegistryKey = Key.OpenSubKey _
    '   (SubKey, RegistryKeyPermissionCheck.Default, Security.AccessControl.RegistryRights.TakeOwnership)
    '  Dim ac As RegistrySecurity = rk.GetAccessControl()  'New RegistrySecurity 
    '  ac.SetOwner(New NTAccount(OwnerName)) 'BUILTIN\Администраторы
    '  'ac.SetAccessRuleProtection(False,false)
    '  rk.SetAccessControl(ac)
    '  SetRegistryEntryOwner = True
    'Catch
    '  Debug.Print(Err.Description)
    '  SetRegistryEntryOwner = False
    'End Try

    'Disable the SE_TAKE_OWNERSHIP_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, False)
    If dwRes <> 0 Then
      'Debug.Print "SetPrivilege (2) Error " & dwRes
      GoTo Cleanup
    End If

Cleanup:
    If hToken <> IntPtr.Zero Then CloseHandle(hToken)

  End Function

  'Enabling and Disabling Privileges in C++
  'http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619(v=vs.85).aspx
  Public Function SetPrivilege( _
   ByVal hToken As IntPtr, _
   ByVal lpszPrivilege As String, _
   ByVal bEnablePrivilege As Boolean) As Integer
    ' hToken - access token handle
    ' lpszPrivilege - name of privilege to enable/disable
    ' bEnablePrivilege - to enable or disable privilege

    Dim tP As New TOKEN_PRIVILEGES
    Dim New_tp As New TOKEN_PRIVILEGES
    Dim mLUID As New LUID
    If LookupPrivilegeValue("", lpszPrivilege, mLUID) = False Then
      Debug.Print("LookupPrivilegeValue Error " & Err.LastDllError)
      SetPrivilege = Err.LastDllError
      Exit Function
    End If

    tP.PrivilegeCount = 1
    tP.pLuid = mLUID
    If bEnablePrivilege Then
      tP.Attributes = SE_PRIVILEGE_ENABLED
    Else
      tP.Attributes = 0
    End If
    If AdjustTokenPrivileges(hToken, False, tP, 4 + (12 * tP.PrivilegeCount), _
     New_tp, 4 + (12 * New_tp.PrivilegeCount)) = False Then
      Debug.Print("AdjustTokenPrivileges Error " & Err.LastDllError)
      SetPrivilege = Err.LastDllError
      Exit Function
    End If

    If Err.LastDllError = ERROR_NOT_ALL_ASSIGNED Then
      Debug.Print("AdjustTokenPrivileges Error " & Err.LastDllError)
      SetPrivilege = Err.LastDllError
      Exit Function
    End If

    'при успехе эта ф-ция вернет 0
    Return 0
  End Function



С SetNamedSecurityInfo вместо упомянутого .Net -кода по которому вопрос.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844280
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну делай тестовый проект на шарпе и кидай сюда. Посмотрим.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844299
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Не пишу я на C#. Ну, вроде накидал.
Код: 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.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Diagnostics;


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
            RegistryKey rk = Registry.ClassesRoot;
            rk = rk.OpenSubKey("AppID\\{AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0}",
                RegistryKeyPermissionCheck.Default, System.Security.AccessControl.RegistryRights.TakeOwnership);
            RegistrySecurity ac = rk.GetAccessControl();
            SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
            NTAccount account = new NTAccount(sid.Translate(typeof(NTAccount)).Value);
            ac.SetOwner(account);
            rk.SetAccessControl(ac);
            }
            catch (System.IO.IOException er)
            {
                Debug.Print(er.Message);
            }

        }

    }
}

...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844459
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй запускать код от System. Для тестов своего exe используй psexec, вот тут пример.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844566
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Я в курсе этой утилиты от Русиновича. Попробовал - не заработало. Да и не должно было. Смена владельца делается под администратором.
Я думаю не заработает оно, не в коде дело, а в нетовской реализации.
Бага 2 как минимум:

1) не реализован механизм взятия привелегии SE_TAKE_OWNERSHIP_NAME через token текущего процесса без которого смена владельца не возможна
Отсюда ошибка: Запрошенный доступ к реестру запрещен
Хотя по логике RegistryRights.TakeOwnership должен обеспечивать именно этот механизм.

И даже если ее побороть извне, то
2) Метод SetAccessControl очевидно пытается впихнуть в объект все в куче, т.е. Dacl, Sacl и SidOwner. А на Dacl и Sacl прав нет.
Отсюда ошибка: Не удалось выполнить запись в раздел реестра

Так что забей наверно, приятного отпуска и с Наступающим.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844568
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, спасибо, взаимно. А нафига вообще тебе этот беспощадный велосипед нужен? Сколько работаю с .NET, а до этого пилил на дельфи, никогда такого не требовалось.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844689
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУнафига вообще тебе этот беспощадный велосипед нужен?
Конкретно с owner, жесть конечно, но если интересно:
У меня в программе документ печатается из-под сервиса (SYSTEM)
На Win 8/8.1 x64 есть проблема.
Способ фиксации (от Microsoft) описан например здесь (в ответе за #1):
Printing from windows service on windows 8 fails
Сводится к удалению 3-х параметров из реестра из ветки, владельцем которой администратор не является и прав на удаление параметров не имеет. Т.е. аккуратный код делает админа owner, модифицирует dacl (дает право удалить параметры), удаляет параметры, модифицирует dacl назад и возвращает прежнего владельца.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844695
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жесткач, конечно. А если вынести вот эту жуть конфигурацию в отдельный задокументированный админский таск, в котором он ручками подготавливает реестр и разворачивает сервис печати. Всё-таки сервис печати не должен сам лезть в такие дебри. Представь себе ситуацию, если была бы проблема с кольцом защиты ядра Ring0, которое не давало бы нормально печатать из сервиса. И что получается, сервис должен фиксить это? :)
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38844707
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не бери в голову. Моя программа всего лишь делает printto (документ,выбранный пользователем принтер). И под System (когда запущена как сервис) на 8-ке это не работает в силу бага, который описан по ссылке. Пользователь моей проги как правило далек от админских задач, наивно полагать что он будет читать подобные доки, поэтому проще один раз имплементировать фикс в инсталлятор.
Ты просто спросил зачем мне нужно менять Владельца, я привел пример, обсуждать "моральную сторону" я не готов.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38845134
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле одна ошибка в этом коде есть, и странно что никто не заметил.

Вот так надо:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    Try
      Dim rk As RegistryKey = Key.OpenSubKey _
       (SubKey, RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.TakeOwnership)
      Dim ac As RegistrySecurity = rk.GetAccessControl()
      ac.SetOwner(New NTAccount(OwnerName)) 'BUILTIN\Администраторы; "NT SERVICE\TrustedInstaller"
      rk.SetAccessControl(ac)
      SetRegistryEntryOwnerNet = True
    Catch
      Debug.Print(Err.Description)
      SetRegistryEntryOwnerNet = False
    End Try



Но при этом без привелегий для процесса SE_TAKE_OWNERSHIP_NAME(назначить владельцем себя) и SE_RESTORE_NAME(назначить владельцем другого) работать не будет.
А вот так типа наконец заработало (хоть что-то):

Код: 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.
 Public Function SetRegistryEntryOwnerNet(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal OwnerName As String) As Boolean
    'назначает владельца ветки реестра
    Dim hToken As IntPtr
    Dim dwRes As Integer

    SetRegistryEntryOwnerNet = False

    'If the preceding call failed because access was denied,
    'enable the SE_TAKE_OWNERSHIP_NAME privilege, create a SID for
    'the Administrators group, take ownership of the object, and
    'disable the privilege. Then try again to set the object's DACL.

    ' Open a handle to the access token for the calling process.
    If OpenProcessToken(Process.GetCurrentProcess().Handle, _
                            TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
                            hToken) = False Then
      Debug.Print("OpenProcessToken Error " & Err.LastDllError)
      Return False
    End If

    'Enable the SE_TAKE_OWNERSHIP_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, True)
    If dwRes <> 0 Then
      'Debug.Print "SetPrivilege (1) Error " & dwRes
      SetRegistryEntryOwnerNet = False
      GoTo Cleanup
    End If

    'Enable the SE_RESTORE_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_RESTORE_NAME, True)
    If dwRes <> 0 Then
      'Debug.Print("SetPrivilege (2) Error " & dwRes)
      GoTo Cleanup
    End If

   'кусок .Net-кода
   Try
      Dim rk As RegistryKey = Key.OpenSubKey _
       (SubKey, RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.TakeOwnership)
      Dim ac As RegistrySecurity = rk.GetAccessControl()
      ac.SetOwner(New NTAccount(OwnerName)) 'BUILTIN\Администраторы; "NT SERVICE\TrustedInstaller"
      rk.SetAccessControl(ac)
      SetRegistryEntryOwnerNet = True
    Catch
      Debug.Print(Err.Description)
      SetRegistryEntryOwnerNet = False
    End Try
  'кусок .Net-кода
 
    'Disable the SE_TAKE_OWNERSHIP_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, False)
    If dwRes <> 0 Then
      'Debug.Print "SetPrivilege (3) Error " & dwRes
      GoTo Cleanup
    End If

    'Disable the SE_RESTORE_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_RESTORE_NAME, False)
    If dwRes <> 0 Then
      'Debug.Print "SetPrivilege (4) Error " & dwRes
      GoTo Cleanup
    End If

Cleanup:
    If hToken <> IntPtr.Zero Then CloseHandle(hToken)

  End Function


Net.-объект Process насколько я понял Security не имеет.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38845236
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Net.-объект Process насколько я понял Security не имеет.
http://codearticles.ru/articles/2547
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38845383
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

.. если вы цивилизационно не против внешних утилит в инсталляторе, то посмотрите на
SubInACL.exe

... она поддерживается Майкрософтом и заточена именно на манипуляции с правами/сменой владельца, и на реестр в том числе ...
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38845789
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУДмитрий77Net.-объект Process насколько я понял Security не имеет.
http://codearticles.ru/articles/2547
Нет, это не то. Приведенный вами код - это Net-обертка над ShellExecuteEx function . И да - я это использую - чтобы запустить программу "Run As Administrator".

То это вот это:
Process Privileges

Но это просто кто-то написал dll на базе тех же API, которые в моем коде - смысл? если я это умею делать сам.

carrotikДмитрий77,

.. если вы цивилизационно не против внешних утилит в инсталляторе, то посмотрите на
SubInACL.exe

... она поддерживается Майкрософтом и заточена именно на манипуляции с правами/сменой владельца, и на реестр в том числе ...
Опять же, нецивилизованно это - зачем мне внешний exe или внешняя dll, если я умею работать с API напрямую из своего кода, при этом еще понимая что я делаю. Это сойдет если надо сделать быстро и не знаешь/не хочешь врубаться в тему.
Кстати, я работаю с правами не только из инсталлятора. Кроме реестра и папок/файлов есть еще например права на запуск/остановку/удаление сервиса. Пожалуй 3 вещи, которые мне нужны.

Мне было интересно сделать полностью через .Net класс RegistrySecurity.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38845951
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77МСУпропущено...
http://codearticles.ru/articles/2547
Нет, это не то. Приведенный вами код - это Net-обертка над ShellExecuteEx function . И да - я это использую - чтобы запустить программу "Run As Administrator".
Не фантазируй, чтобы запускать Run As Administrator, нужно делать манифест в проекте:

Код: xml
1.
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />



И тот велосипед выше вовсе не нужен.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38845983
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Делать такой манифест - это плохо и не рекомендовано MS.
Правильно:
Код: xml
1.
       <requestedExecutionLevel level="asInvoker" uiAccess="false" />


(asInvoker исключает нежелательную виртуализацию папок типа Program Files)
С админским манифестом в нехороший довесок еще получаем нездоровый интерес со стороны антивирусов.

А "велосипед" очень удобный.
Я обычно делаю так.
Exe-шник стандартно запущен под обычным пользователем.
Если какое-то действо требует админа, то велосипедом запускаем себя самого (с Command -параметром) и возвращаем результат "админского исполнения" в неадминский текущий запуск. Если еще exe-шник подписан CodeSigning то это выглядит очень достойно.

Код: 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.
     Dim eResult As ExecuteStatus _
       = ExecuteProcess(Application.ExecutablePath, ProcessWindowStyle.Normal, strAdminCmd, True)
      Select Case eResult
        Case ExecuteStatus.res_OK
          AddFixLog("Run as administrator... Done.")
        Case ExecuteStatus.res_CANCEL
          AddFixLog("Run as administrator... Failed. User canceled the operation.")
...
      End Select
  Public Function ExecuteProcess(ByVal FilePath As String, _
   Optional ByVal nShow As ProcessWindowStyle = ProcessWindowStyle.Normal, _
   Optional lpParameters As String = vbNullString, _
   Optional LaunchElevated As Boolean = False, _
   Optional useDoEvent As Boolean = False) As ExecuteStatus

    'useDoEvent -использует цикл с DoEvent вместо WaitForSingleObject

    Dim ExecInfo As New ProcessStartInfo
    With ExecInfo
      .FileName = FilePath
      .WindowStyle = nShow
      .WorkingDirectory = IO.Path.GetDirectoryName(FilePath)
      .Arguments = lpParameters
      .UseShellExecute = True
      ' On Microsoft Windows Vista and later, one can use runas instead of Open, in order to execute the
      ' process as an elevated process. In that case, the user will be asked whether he or she wants to
      ' run the process as an administrator.
      If LaunchElevated = True Then
        .Verb = "runas"
      Else
        .Verb = "Open"
      End If
    End With

    Dim procExec As New Process
    Try
      procExec = Process.Start(ExecInfo)
    Catch
      Return ExecuteStatus.res_CANCEL
    End Try

    If useDoEvent Then
      Do While Not procExec.HasExited
        Application.DoEvents()
      Loop
    Else
      procExec.WaitForExit()
    End If
    If procExec.ExitCode = 0 Then
      Return ExecuteStatus.res_OK
    Else
      Return ExecuteStatus.res_FAILED
    End If
  End Function



Но мы сбились с темы.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846020
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77МСУ, Делать такой манифест - это плохо и не рекомендовано MS.
Почему плохо и где написано, что не рекомендовано MS? Обычно принято подкреплять такие громкие слова пруфом, если что.

Дмитрий77Правильно:
Код: xml
1.
       <requestedExecutionLevel level="asInvoker" uiAccess="false" />


(asInvoker исключает нежелательную виртуализацию папок типа Program Files)
С админским манифестом в нехороший довесок еще получаем нездоровый интерес со стороны антивирусов.
Кто сказал, что это "правильно"? Кто определяет эти правила?

Дмитрий77А "велосипед" очень удобный.
Я обычно делаю так.
Exe-шник стандартно запущен под обычным пользователем.
Если какое-то действо требует админа, то велосипедом запускаем себя самого (с Command -параметром) и возвращаем результат "админского исполнения" в неадминский текущий запуск. Если еще exe-шник подписан CodeSigning то это выглядит очень достойно.
Бред сивой кобылы. Сам себе выдумываешь на пустом месте и с помощью какого-то хлама с кодплекса пытаешься бороться с ветряными мельницами. Есть штатный функционал, который управляется на манифестном уровне или с помощью UAC, на выбор. Всё остальное - удел школьников по постройке баррикад.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846023
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77С админским манифестом в нехороший довесок еще получаем нездоровый интерес со стороны антивирусов
1. В этом нет ничего плохого, антивирус должен иметь всегда повышенный интерес к любым исполняемым файлам и скриптам.
2. Если хватило ума поставить антивирус, сможешь управлять и исключениями.
3. На счет повышенного интереса, всё же, это сказки. Это равносильно тому, что в настройках ярлыка в "Дополнительно" указать галку "Запуск от имени администратора". Антивирус анализирует код.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846052
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, вот, учи матчасть Create and Embed an Application Manifest (UAC)

asInvokerThe application runs with the same access token as the parent process.
Recommended for standard user applications. Do refractoring with internal elevation points, as per the guidance provided earlier in this document.

highestAvailableThe application runs with the highest privileges the current user can obtain.
Recommended for mixed-mode applications. Plan to refractor the application in a future release.

requireAdministratorThe application runs only for administrators and requires that the application be launched with the full access token of an administrator.
Recommended for administrator only applications. Internal elevation points are not needed. The application is already running elevated.

1. Такого у MS нигде нет, что requireAdministrator - плохо и не рекомендуется.
2. Если твоему коду нужны соответствующие гранты, значит нужен именно requireAdministrator. И выдумывать какие-то костыли внутри кода, да и с еще каким-то входными параметрами - это беспощадное зло, за которое нужно бить линейкой по рукам.
3. Есть штатные механизмы, которые поддерживаются на уровне операционных систем, следуем этим прописным правилам и получаем профиты. Велосипедам место на свалке.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846128
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Я прекрасно и давно знаю что такое манифест и для чего он нужен. Умею их рисовать и вставлять в ресурсы. Я на VB6 писал, там в отличии от новомодных студий он "автоматом" не генерируется и надо делать ручками.
>Такого у MS нигде нет, что requireAdministrator - плохо и не рекомендуется.
Да но сам же привел цитату что рекомендуется.
asInvokerRecommended for standard user applications.
Я стараюсь писать именно standard user applications.
Если из 100 ф-ций одна требует администратора, то именно методом запуска с повышением прав ее и разумно запускать, а не чтоб вся прога от админа.

И даже если приложение надо запускать только от администратора, хотя бы из-за антивирусов я бы применил описанный прием (перезапуск самого себя) а не манифест. False Positive -это довольно большое зло, и очень тяжело объяснять это клиенту, а антивирусы сам знаешь как пишутся - хуже реальных вирусов.

Давай не спорить про ерунду, тем более мы съехали с темы.
А съехали потому что ты стал говорить про Process-> LaunchElevated вместо Process Privileges, что не одно и то же.

Ну, а по теме кода со сменой владельца сказать наверно уже больше нечего. Оставил чистые API т.к. это лучше чем каша из .Net и API, а через чисто .Net не получится.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846571
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Да но сам же привел цитату что рекомендуется.
asInvokerRecommended for standard user applications.
Там 3 рекомендации, если ты заметил. Каждому кейсу свой параметр. Где ты там прочел, что "requireAdministrator - плохо и не рекомендуется"?

Дмитрий77Я стараюсь писать именно standard user applications.
Я не против.

Дмитрий77Если из 100 ф-ций одна требует администратора, то именно методом запуска с повышением прав ее и разумно запускать, а не чтоб вся прога от админа.
Если хоть 1 функция из 1 миллиарда требует администратора, то запуск должен быть именно requireAdministrator для всей песочницы. И никак иначе.

Дмитрий77И даже если приложение надо запускать только от администратора, хотя бы из-за антивирусов я бы применил описанный прием (перезапуск самого себя) а не манифест. False Positive -это довольно большое зло, и очень тяжело объяснять это клиенту, а антивирусы сам знаешь как пишутся - хуже реальных вирусов.
Да что ты заладил со своими антивирусами. Причем тут они? Если приложению требуются повышенные привилегии, для этого есть 3 параметра в манифесте. Всё. Не усложняй и не приплетай какие-то байки из склепа.

Дмитрий77Давай не спорить про ерунду, тем более мы съехали с темы.
А съехали потому что ты стал говорить про Process-> LaunchElevated вместо Process Privileges, что не одно и то же.
Ну так ты умей внятно формулировать вопросы. Ты спросил:

Дмитрий77Net.-объект Process насколько я понял Security не имеет

Что под этим понимать? Я понял, что речь об этом 17065886 Какие ко мне вопросы?

Дмитрий77Ну, а по теме кода со сменой владельца сказать наверно уже больше нечего. Оставил чистые API т.к. это лучше чем каша из .Net и API, а через чисто .Net не получится.
По теме мне сказать нечего, увы.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846693
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перестал обращать внимания на посты Дмитрий77 (и всем советую), т.к. он не воспринимает рекомендации и критику. Даже не понимаю, зачем он темы создает. Наверное самоутвердиться.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846713
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JeStoneДаже не понимаю, зачем он темы создает.
Блог уже рекомендовали завести
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846732
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУНу так ты умей внятно формулировать вопросы. Ты спросил:

Дмитрий77Net.-объект Process насколько я понял Security не имеет

Что под этим понимать? Я понял, что речь об этом 17065886

Вообще-то я вполне однозначно указал о чем идет речь:

Дмитрий77Но при этом без привелегий для процесса SE_TAKE_OWNERSHIP_NAME (назначить владельцем себя) и SE_RESTORE_NAME (назначить владельцем другого) работать не будет.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
    ' access token for the calling process.
    If OpenProcessToken(Process.GetCurrentProcess().Handle, _
                            TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
                            hToken) = False Then

    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, True)
    dwRes = SetPrivilege(hToken, SE_RESTORE_NAME, True)


Net.-объект Process насколько я понял Security не имеет.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846751
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77МСУНу так ты умей внятно формулировать вопросы. Ты спросил:

пропущено...


Что под этим понимать? Я понял, что речь об этом 17065886

Вообще-то я вполне однозначно указал о чем идет речь:

Дмитрий77Но при этом без привелегий для процесса SE_TAKE_OWNERSHIP_NAME (назначить владельцем себя) и SE_RESTORE_NAME (назначить владельцем другого) работать не будет.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
    ' access token for the calling process.
    If OpenProcessToken(Process.GetCurrentProcess().Handle, _
                            TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
                            hToken) = False Then

    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, True)
    dwRes = SetPrivilege(hToken, SE_RESTORE_NAME, True)


Net.-объект Process насколько я понял Security не имеет.
Я не понимаю тебя. Зачем ты выделил Process.GetCurrentProcess, hToken, SE_TAKE_OWNERSHIP_NAME и SE_RESTORE_NAME? Что я должен понять из этого, исходя из входного вопроса "Net.-объект Process насколько я понял Security не имеет" ? Более того, изначально эти куски кода не были выделены, а были выделены комментарии. К чему ты их выделил, мне тоже не понятно. Да и сам вопрос про "объект Process" задан в самом конце, хер пойми к чему он относится. В порыве твоего потока сознания это вполне мог бы быть просто отдельный вопрос. Если хочешь, чтобы тебя понимали, говори внятно и членораздельно. Если ты вбрасываешь кучу гавнокода вперемешку с потоком сознания, выводами и вопросами - это ни к чему хорошему не приведет. Я удивлен, что ты еще умудряешься ткнуть меня носом в свой поток больного воображения и недовольно промычать, мол всё же написано, читай внимательнее. Ты это, приземлись на землю что ли.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846820
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Все, проехали. Не надо ничего понимать. Извини что напряг.
Гавнокодом называешь то что писано в MSDN?

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379620(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619(v=vs.85).aspx

Скорее .Net классы каким-то гавнокодом не тем кодом писаны, раз полноценно не делают даже того что заявлено в .Net документации.
http://msdn.microsoft.com/ru-ru/library/system.security.accesscontrol.objectsecurity.setowner(v=vs.110).aspx

Признать это слабо? Проще на меня кучу грязи вылить?

Все, хватит уже грызться. С Новым Годом!
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846831
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Гавнокодом называешь то что писано в MSDN?
Гавнокодом называю то, что ты тут пишешь вместо явного использования манифеста.

Дмитрий77Скорее .Net классы каким-то гавнокодом не тем кодом писаны, раз полноценно не делают даже того что заявлено в .Net документации.
Не нравится, сиди колупай свой убогий vb 6.0. Мне за 10 лет кодирования ни разу не понадобилось заниматься той херней, которой занимаешься ты. Можешь дальше сидеть на пустом месте и бороться с ветряными мельницами.

Дмитрий77Признать это слабо? Проще на меня кучу грязи вылить?
Я не могу признать, т.к. детально не разбирался в твоем вопросе. Возможно где-то что-то упусщено.

Дмитрий77Все, хватит уже грызться. С Новым Годом!
Спасибо, взаимно.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846856
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

>что ты тут пишешь вместо явного использования манифеста.
Манифест к вопросу никакого отношения не имеет. Исходили из того что процесс де-факто запущен от имени администратора (неважно каким способом это достигнуто). Но просто "Run is Admin" недостаточно чтобы сменить владельца объекта.

>Не нравится, сиди колупай свой убогий vb 6.0.
При чем тут VB6? Речь идет о Win32 API. А они одинаково "колупаются" из "убогого vb6", "модного .Net", или классического C/C++

>Я не могу признать, т.к. детально не разбирался в твоем вопросе. Возможно где-то что-то упусщено.
Ну, я то "детально разобрался". Сказал, чего не хватает (Process Privileges). Спросил, как эти привелегии дать при помощи .Net классов (неудачно употребил слово Security, каюсь). Даже уже понял, что с помощью .Net видимо никак. А причем тут ветряные мельницы? Был бы метод SetOwner метод нормально написан, он бы необходимые SetPrivileges автоматом делал.

>Спасибо, взаимно.
Спасибо
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846857
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77как эти привелегии дать при помощи .Net классов
шиза косила наши ряды
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846862
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Манифест к вопросу никакого отношения не имеет.
Ты же сам поднял этот вопрос тут 17068251 , а теперь говоришь, что никакого отношения не имеет. Странный ты. Сначала сам вбрасываешь, потом тебе люди отвечают, а после удивляешься, что тема якобы другая.

Дмитрий77Исходили из того что процесс де-факто запущен от имени администратора (неважно каким способом это достигнуто).
Это всё хорошо, только зачем ты приводишь ссылки на всякие processprivileges.codeplex.com. Сам начинаешь срать людям в мозг, а потом чему-то удивляешься.

Дмитрий77Но просто "Run is Admin" недостаточно чтобы сменить владельца объекта.
Я ответил уже по этому поводу. Нет времени (да и желания) досконально вникнуть в тему. Чисто поверхностно попробовал варианты, не получилось, забил.

Дмитрий77При чем тут VB6?
1. Не .NET
2. Исходя из твоего профиля, я вижу, что твой бэкграунд это нативный VB
3. По-моему, всё логично

Дмитрий77Речь идет о Win32 API. А они одинаково "колупаются" из "убогого vb6", "модного .Net", или классического C/C++
Ну так ты начал наезжать на ".Net документацию", вот я тебе и объяснил, не нравится, вали в натив. Освободи свой разум от модного .NET. Колупания в реестре на .NET всегда считалось моветоном, я даже вспомнить не могу, когда я последний раз имел дела с реестром в дотнете.

Дмитрий77Ну, я то "детально разобрался"
Возможно, но довериться 100% не могу, пока сам лично не проверю. А времени и желания нету, сам понимаешь.

Дмитрий77Был бы метод SetOwner метод нормально написан, он бы необходимые SetPrivileges автоматом делал.
Сто пудов ты где-то чего-то не учел.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846882
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё работает.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var user = new NTAccount("TestUser");

using (var key = Registry.CurrentUser.OpenSubKey("Software\\7-Zip\\Test", true))
{
    var rs = new RegistrySecurity();
    rs.AddAccessRule(new RegistryAccessRule(user, RegistryRights.FullControl,
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
        PropagationFlags.InheritOnly, AccessControlType.Allow));
    key.SetAccessControl(rs);
}
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846884
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так тоже работает.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var user = new NTAccount("TestUser");

using (var key = Registry.CurrentUser.OpenSubKey("Software\\7-Zip\\Test", true))
{
    var rs = key.GetAccessControl();
    rs.AddAccessRule(new RegistryAccessRule(user, RegistryRights.FullControl,
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
        PropagationFlags.InheritOnly, AccessControlType.Allow));
    key.SetAccessControl(rs);
}
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846885
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И самая главная твоя глупость, трансляция не нужна:

Код: c#
1.
2.
SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
NTAccount account = new NTAccount(sid.Translate(typeof(NTAccount)).Value);



В SetOwner можно подавать сразу готовый SecurityIdentifier, он же IdentityReference.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846898
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая конструкция тоже на ура работает.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var user = new NTAccount("TestUser");
            
using (var key = Registry.CurrentUser.OpenSubKey("Software\\7-Zip\\Test", true))
{
    var rs = key.GetAccessControl();
    rs.AddAccessRule(new RegistryAccessRule(user, RegistryRights.FullControl,
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
        PropagationFlags.None, AccessControlType.Allow));

    var owner = rs.GetOwner(typeof(NTAccount));

    rs.SetOwner(new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null));

    key.SetAccessControl(rs);
}
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38846925
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

>Всё работает.
Что Все?
Понятно что твой код работает (при условии что у CurrentUser есть права на изменение правил, а в Registry.CurrentUser.OpenSubKey они надо думать есть)
Но речь то шла о rs.SetOwner а не о rs.AddAccessRule

>Такая конструкция тоже на ура работает.
Это ближе к теме
Но опять же, берешь ключ в Registry.CurrentUser.OpenSubKey к которому у тебя есть полный доступ.

Перечитай:
17059827
условия задачиЕсть ветка реестра. У нее Owner=Trusted Installer. У администратора права только на чтение.
Мне надо поменять Owner на Administrators.
Вот мой код (запущен из под администратора):
Здесь необходимые и достаточные условия. Ничего лишнего не написано. Все что написано важно.
Вот примеры таких ключей (по крайней мере на Win8.1 x64):
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\InternetExplorer.Application
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0}

Попробуй ручками сначала поменять из regedit чтоб убедиться что это в принципе делается.

-> Разрешения -> <Дополнительно> -> (Владелец) Изменить
Имя объекта : 'Администраторы' (если русская OS)
Если менять назад на TrustedInstaller, то пишем полностью 'NT Service\TrustedInstaller'
(без кавычек ясно дело)

>И самая главная твоя глупость, трансляция не нужна:
>В SetOwner можно подавать сразу готовый SecurityIdentifier, он же IdentityReference.
Пофиг. Хочешь sid бери, хочешь name.
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38847752
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, эти грабли тянутся не из-за дотнета http://theether.net/kb/100172
...
Рейтинг: 0 / 0
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
    #38847859
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Ну так подведем итоги?

условия задачиЕсть ветка реестра. У нее Owner=Trusted Installer. У администратора права только на чтение.
Мне надо поменять Owner на Administrators.
Вот мой код (запущен из под администратора):

Решение #1. Рабочее. (утилита CMD)
МСУ http://theether.net/kb/100172
Resolution

http://theether.net/kb/100172 SetACL can be used to take ownership, and to grant permissions. Ensure the following commands are run from a "Run as Administrator" command prompt.

Take Ownership
C:\>SetACL.exe -on "HKLM\SOFTWARE\Classes\CLSID\{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}\ShellFolder" -ot reg -actn setowner -ownr "n:Administrators"
INFO: Processing ACL of: <machine\SOFTWARE\Classes\CLSID\{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}\ShellFolder>

SetACL finished successfully.

Решение #2. Рабочее (документация Microsoft)
==то, что вы назвали моим гавнокодом

http://msdn.microsoft.com/en-us/library/windows/desktop/aa379620(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619(v=vs.85).aspx

Код: 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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
  'Taking Object Ownership in C++
  'http://msdn.microsoft.com/en-us/library/windows/desktop/aa379620(v=vs.85).aspx
  Public Function SetSecurityOwner(ByVal pszObjName As String, _
   ByVal ObjectType As SE_OBJECT_TYPE, _
   ByVal AcctName As String, Optional ByVal DomnName As String = "") As Integer
    'назначает группу/аккаунт [DomnName + '\' +] AcctName владельцем объекта (по читаемому имени)

    'AcctName - account name, DomnName - domain name
    Dim AccountName As String 'на вход DomnName + '\' + AcctName

    Dim dwRes As Integer
    Dim hToken As IntPtr
    Dim p_abytSIDTarget() As Byte 'вместо pSIDTarget
    Dim pSIDTarget As IntPtr
    Dim dwSIDTarget As Integer 'size of the Sid buffer
    Dim DomainName As String = "" 'domain name на выходе
    Dim dwDomainName As Integer 'size of domain name buffer
    Dim eUse As Integer 'SID type
    Dim bRtnBool As Boolean

    If (pszObjName = "") Then
      SetSecurityOwner = ERROR_INVALID_PARAMETER
      'Debug.Print "ERROR_INVALID_PARAMETER"
      Exit Function
    End If

    'Create a SID for specified account
    If Strings.Len(DomnName) > 0 Then
      AccountName = DomnName & "\" & AcctName
    Else
      AccountName = AcctName
    End If
    'Preinitialize p_abytSIDAdmin array with one element. It will be redimmed lated
    ReDim p_abytSIDTarget(1)
    'First call to LookupAccountName to get the buffer sizes.
    bRtnBool = LookupAccountName(vbNullString, AccountName, p_abytSIDTarget, dwSIDTarget, _
     DomainName, dwDomainName, eUse)
    If (bRtnBool = False) And (Err.LastDllError <> ERROR_INSUFFICIENT_BUFFER) Then
      'Debug.Print("LookupAccountName (1) Error " & Err.LastDllError)
      dwRes = Err.LastDllError
      GoTo Cleanup
    End If

    'Debug.Print("dwSIDTarget=" & dwSIDTarget & vbCrLf & "dwDomainName=" & dwDomainName)

    'Allocate the required space in the p_abytSIDAdmin and DomainName string
    'variables. Allocate 1 byte less to avoid the appended NULL character.
    ReDim p_abytSIDTarget(dwSIDTarget)
    DomainName = Space(dwDomainName - 1)

    'Second call to LookupAccountName to get p_abytSIDAdmin.
    bRtnBool = LookupAccountName(vbNullString, AccountName, p_abytSIDTarget, dwSIDTarget, _
     DomainName, dwDomainName, eUse)
    If bRtnBool = False Then
      'Debug.Print("LookupAccountName (2) Error " & Err.LastDllError)
      dwRes = Err.LastDllError
      GoTo Cleanup
    End If

    'Debug.Print(DomainName)

    'If the preceding call failed because access was denied,
    'enable the SE_TAKE_OWNERSHIP_NAME privilege, create a SID for
    'Target group, take ownership of the object, and
    'disable the privilege. Then try again to set the object's DACL.

    ' Open a handle to the access token for the calling process.
    bRtnBool = OpenProcessToken(Process.GetCurrentProcess().Handle, _
                            TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, _
                            hToken)
    If bRtnBool = False Then
      'Debug.Print("OpenProcessToken Error " & Err.LastDllError)
      dwRes = Err.LastDllError
      GoTo Cleanup
    End If

    'Enable the SE_TAKE_OWNERSHIP_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, True)
    If dwRes <> 0 Then
      'Debug.Print("SetPrivilege (1) Error " & dwRes)
      GoTo Cleanup
    End If

    'Enable the SE_RESTORE_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_RESTORE_NAME, True)
    If dwRes <> 0 Then
      'Debug.Print("SetPrivilege (2) Error " & dwRes)
      GoTo Cleanup
    End If

    pSIDTarget = Marshal.AllocHGlobal(dwSIDTarget)
    Marshal.Copy(p_abytSIDTarget, 0, pSIDTarget, dwSIDTarget)
    'Set the owner in the object's security descriptor.
    dwRes = SetNamedSecurityInfo(pszObjName, ObjectType, _
     OWNER_SECURITY_INFORMATION, _
     pSIDTarget, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero)
    If dwRes <> ERROR_SUCCESS Then
      'Debug.Print("SetNamedSecurityInfo Error " & CStr(dwRes) & RaiseAPIErrorByNumber(dwRes))
      GoTo Cleanup
    End If

    'Disable the SE_TAKE_OWNERSHIP_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, False)
    If dwRes <> 0 Then
      'Debug.Print "SetPrivilege (3) Error " & dwRes
      GoTo Cleanup
    End If

    'Disable the SE_RESTORE_NAME privilege.
    dwRes = SetPrivilege(hToken, SE_RESTORE_NAME, False)
    If dwRes <> 0 Then
      'Debug.Print "SetPrivilege (4) Error " & dwRes
      GoTo Cleanup
    End If

Cleanup:
    If hToken <> IntPtr.Zero Then CloseHandle(hToken)

    If Not pSIDTarget.Equals(0) Then
      Marshal.FreeHGlobal(pSIDTarget)
    End If

    SetSecurityOwner = dwRes

  End Function


  'Enabling and Disabling Privileges in C++
  'http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619(v=vs.85).aspx
  Public Function SetPrivilege( _
   ByVal hToken As IntPtr, _
   ByVal lpszPrivilege As String, _
   ByVal bEnablePrivilege As Boolean) As Integer
    ' hToken - access token handle
    ' lpszPrivilege - name of privilege to enable/disable
    ' bEnablePrivilege - to enable or disable privilege

    Dim tP As New TOKEN_PRIVILEGES
    Dim New_tp As New TOKEN_PRIVILEGES
    Dim mLUID As New LUID
    If LookupPrivilegeValue("", lpszPrivilege, mLUID) = False Then
      Debug.Print("LookupPrivilegeValue Error " & Err.LastDllError)
      SetPrivilege = Err.LastDllError
      Exit Function
    End If

    tP.PrivilegeCount = 1
    tP.pLuid = mLUID
    If bEnablePrivilege Then
      tP.Attributes = SE_PRIVILEGE_ENABLED
    Else
      tP.Attributes = 0
    End If
    If AdjustTokenPrivileges(hToken, False, tP, 4 + (12 * tP.PrivilegeCount), _
     New_tp, 4 + (12 * New_tp.PrivilegeCount)) = False Then
      Debug.Print("AdjustTokenPrivileges Error " & Err.LastDllError)
      SetPrivilege = Err.LastDllError
      Exit Function
    End If

    If Err.LastDllError = ERROR_NOT_ALL_ASSIGNED Then
      Debug.Print("AdjustTokenPrivileges Error " & Err.LastDllError)
      SetPrivilege = Err.LastDllError
      Exit Function
    End If

    'при успехе эта ф-ция вернет 0
    Return 0
  End Function



А здесь ГРАБЛИ!!!
Решение #3. (.Net)
http://msdn.microsoft.com/ru-ru/library/system.security.accesscontrol.objectsecurity.setowner(v=vs.110).aspx
ObjectSecurity.SetOwner - методЗадает владельца для дескриптора безопасности, связанного с данным объектом ObjectSecurity.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  Public Function SetRegistryEntryOwnerNet(ByVal Key As RegistryKey, ByVal SubKey As String, _
   ByVal OwnerName As String) As Boolean
    Try
      Dim rk As RegistryKey = Key.OpenSubKey _
       (SubKey, RegistryKeyPermissionCheck.ReadWriteSubTree, Security.AccessControl.RegistryRights.TakeOwnership)
      Dim ac As RegistrySecurity = rk.GetAccessControl()
      ac.SetOwner(New NTAccount(OwnerName)) 'BUILTIN\Администраторы; "NT SERVICE\TrustedInstaller"
      rk.SetAccessControl(ac)
      SetRegistryEntryOwnerNet = True
    Catch
      Debug.Print(Err.Description)
      SetRegistryEntryOwnerNet = False
    End Try
  End Function


НЕ РАБОТАЕТ!!!

Или будем дальше спорить? 3-й вариант сумеете реабилитировать?
...
Рейтинг: 0 / 0
60 сообщений из 60, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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