powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
10 сообщений из 60, страница 3 из 3
А как в .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
10 сообщений из 60, страница 3 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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