powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
17 сообщений из 17, страница 1 из 1
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39620848
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Система x64
Приложение компилируется/запускается как 32-бит (не обсуждаемое условие)
Надо поменять чего-нибудь в реестре, в 64-битной ветке без авто-редиректов в WOW6432Node
Собственно записать-прочитать, нет проблем, KEY_WOW64_64KEY

Но допустим, нет прав, но под админом их можно обрести (смена владельца, задание прав).
Как дать права, это все умею.
НО.
SE_OBJECT_TYPE enumeration
Код: vbnet
1.
2.
3.
4.
5.
6.
  Public Enum SE_OBJECT_TYPE
...
    SE_REGISTRY_KEY
...
    SE_REGISTRY_WOW64_32KEY
  End Enum


Полезет в 32-битную WOW6432Node.
Обойти можно?

Есть такой ход конем
Wow64DisableWow64FsRedirection function
Код: plaintext
1.
2.
3.
Wow64DisableWow64FsRedirection(ptr)
... здесь можно скопировать напр. файл в System32 (а не в SYSWOW64)
Wow64RevertWow64FsRedirection(ptr)


Но прокатит ли это с реестром?
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39620865
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
А что именно записывать собрался?
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39621115
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123А что именно записывать собрался?
Ой, много у меня там.
Например
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\...
HKEY_CLASSES_ROOT\CLSID\...
HKEY_CLASSES_ROOT\Interface\...

Причем многое из того чего писать, на x64 надо дублировать в основную ветку и в WOW6432Node.
На многие из целевых ключей (если уже они уже есть),
стоит TrustedInstaller + нет полного доступа для админов,
т.е. просто тупо записи админом (ф-ции реестра с KEY_WOW64_64KEY) не достаточно.
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39621136
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77HKEY_CLASSES_ROOT\CLSID\...
HKEY_CLASSES_ROOT\Interface\...
COM объекты?
Свой инсталлятор?
...
Просто мало кто на таком нижнем уровне API работает.
Вот и поинтересовался.
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39621152
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

21283557 там ссылки на зипы, в зипах есть reg-файлы, собственно на эту тему и развлекаемся
типа свой инсталлятор-реаниматор

Просто мало кто на таком нижнем уровне API работает.
Здесь к сожалению только API.
Но слава богу, это все мной наработано за годы, т.е. есть готовые ф-ции в том числе для смены прав и владельца.

Счас тесты накатаю, буду смотреть как с правами в 64-битной ветке бороться из-под 32-бит App.
(проблем скомпилировать x64 app как бы нет, но не хочется плодить зоопарк, а сделать все из единого кода).
Wow64DisableWow64FsRedirection возможно и прокатит, ее только аккуратно вставлять надо и потом отменять.
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39621194
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77типа свой инсталлятор-реаниматорпонятно.
Я использовал готовые библиотеки для MSI и указывал только ветки.

Дмитрий77из-под 32-бит App.
Это ограничение и не обсуждается?
Ведь сам инсталлятор это не приложение.
Его вполне можно отдельно сделать.
Или у вас приложение само себя инсталлирует?
Не врублюсь.
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39621214
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Wow64DisableWow64FsRedirection возможно и прокатит,
Для реестра не работает
сделал
HKEY_CLASSES_ROOT\CLSID\TestKey
с владельцем TrustedInstaller
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\TestKey
с владельцем Администраторы

Запрашиваю владельца, пишет "BuiltIn\Администраторы",
если удалю ключ в Wow6432Node, пишет Err2 Файл не найден
Т.е лезет однозначно в Wow6432Node
Т.е. Wow64DisableWow64FsRedirection только для файловой системы работает.

Код: 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.
      Dim ptr As IntPtr
      MsgBox(Wow64DisableWow64FsRedirection(ptr))

      dwRes = GetRegistryEntryOwner(GetRegEntryString(hKey, sSubKey), Acct_Name, Domain_Name)
      If dwRes = ERROR_SUCCESS Then
        MsgBox("  Owner = " & Domain_Name & "\" & Acct_Name)
      Else
        MsgBox("  Getting information about the current owner... Failed. Error " & RaiseAPIErrorByNumber(dwRes))
      MsgBox(Wow64RevertWow64FsRedirection(ptr))


  Public Function GetRegistryEntryOwner(ByVal RegistryPath As String, _
   ByRef AcctName As String, ByRef DomainName As String) As Integer
    'возвращает владельца ветки реестра
    GetRegistryEntryOwner = GetSecurityOwner(RegistryPath, _
     SE_OBJECT_TYPE.SE_REGISTRY_KEY, _
     AcctName, _
     DomainName)
  End Function
  '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 Integer
    'ф-ция возвращает владельца объекта

    'AcctName - account name, DomainName - domain name
    Dim dwRes As Integer
    Dim pSidOwner As IntPtr 'security identifier
    Dim pSD As IntPtr
    Dim bRtnBool As Boolean
    Dim dwAcctName As Integer 'size of account name buffer
    Dim dwDomainName As Integer '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, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 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 = False) 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 = False Then
      'Debug.Print "LookupAccountSid (2) Error " & Err.LastDllError
      dwRes = Err.LastDllError
      GoTo Cleanup
    End If

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

    GetSecurityOwner = dwRes

  End Function

...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39621267
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, я пришел к печальному выводу, что задача (с поставленными условиями) не имеет решения от слова вообще.

Ну например вот здесь пытались ее решить:
SetNamedSecurityInfo for a 64Bit registry key from a 32Bit Process

Здесь как бы вот.
1) Применительно к поставленной задаче по факту (вроде как) имеем
а) Либо ветка реестра уже есть, тогда там уже есть все параметры и ничего делать не надо (соответственно и права менять не надо).
б) Либо ветки реестра нет, но тогда дефолтных прав админа достаточно чтобы ветку создать и все параметры туда записать (что естественно не проблема, KEY_WOW64_64KEY и вперед)
Возникает конечно опасение ситуации, что ветка есть, какого-нибудь параметра там нету, или неправильный, а прав нету (но вроде такого быть не может).
Поэтому разумно написать инсталлятор без "выяснения прав", + логировать, а там уж смотреть.

2) Можно да, скомпилировать отдельно 64-битный код.
Но, я без крайней необходимости это делать не люблю. Т.е. практика, пишется один код (компилируется 32 бит), а уж там по кейсам он выясняет что за OS и что и куда писать. Зоопарка итак хватает, усугублять его бы не хотелось.
Ну, и как минимум это должен быть единый проект компилируемый и так и эдак (чтобы не поддерживать 2 параллельных проекта, обязательно что-нибудь куда-нибудь забудешь перенести). Any CPU да, но я бы не рисковал, с ним бардак еще тот. У меня напр. в 2013-й студии (win10 X64) Any CPU Debug дефолтный .Net 4.5 проект работает как 32-бит, почему не выяснял но меня устраивает, потом делаю копию и рожаю exe x86 Release чтоб наверняка и однозначно.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39967234
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случайно вернулся к вопросу, надо одну мелочь подправить...

Дмитрий77
Система x64
Приложение компилируется/запускается как 32-бит (не обсуждаемое условие)
Надо поменять чего-нибудь в реестре, в 64-битной ветке без авто-редиректов в WOW6432Node
Собственно записать-прочитать, нет проблем, KEY_WOW64_64KEY

Но допустим, нет прав, но под админом их можно обрести (смена владельца, задание прав).
Как дать права, это все умею.
НО.
SE_OBJECT_TYPE enumeration
Код: vbnet
1.
2.
3.
4.
5.
6.
  Public Enum SE_OBJECT_TYPE
...
    SE_REGISTRY_KEY
...
    SE_REGISTRY_WOW64_32KEY
  End Enum



НО однако же, нормально так MS доки задним числом переписывает:
https://docs.microsoft.com/en-us/windows/win32/api/accctrl/ne-accctrl-se_object_type

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
typedef enum _SE_OBJECT_TYPE {
…
  SE_REGISTRY_KEY,
...
  SE_REGISTRY_WOW64_32KEY,
  SE_REGISTRY_WOW64_64KEY
} SE_OBJECT_TYPE;


При этом нуль описания для SE_REGISTRY_WOW64_64KEY, и как бы
MSMinimum supported client Windows XP [desktop apps only]
Minimum supported server Windows Server 2003 [desktop apps only]

Я не поленился проверить:
Win 10 (Win 2016/2019) - SE_REGISTRY_WOW64_64KEY делает ровно то что хотелось.
Win 8.1 (Win 2012R2); Win7 -не работает, пишет Err87 Параметр задан неверно при попытке его использовать

Т.е. они таки добавили эту "фичу" в десятке.
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39967244
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не проще использовать типы .net и не мучить попу?
Код: c#
1.
2.
using RegistryKey hive = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
using RegistryKey key = hive.OpenSubKey("MyPathKeys");
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39967252
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Хоть бы перечитал об чем речь что-ли.
А речь идет о "SECURITY OBJECTS" - то что описывается словами Разрешения-Безопасность-Security-Владелец (Owner), права на чтение-запись в ветку реестра для разных пользователей.
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39967258
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
using (RegistryKey hive = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
using (RegistryKey key = hive.OpenSubKey("MyRegistryKey"))
{
	RegistrySecurity access = key.GetAccessControl();
	access.AddAccessRule(new RegistryAccessRule(WindowsIdentity.GetCurrent().User, RegistryRights.FullControl, AccessControlType.Deny);
	key.SetAccessControl(access);
}
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39967266
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Ну не то чтоб убедил, но у меня тогда помнится засада была со сменой "владельца" ветки, а не с правами. И в .NET это как бы не получалось от слова вообще (на api получилось только 64-битным кодом).

Ну OK, счас как бы более простая задача.
Надо взять определенный ключ реестра (у админа все права есть и от него запускаем).
И надо для группы "Users (Пользователи)" // ConstructUniversalAndNTWellKnownSids("Users")
добавить "Read"/Allow //GENERIC_READ + ACCESS_MODE.GRANT_ACCESS
И плюс еще чтоб "Этот раздел и его подразделы" //CONTAINER_INHERIT_ACE Or OBJECT_INHERIT_ACE
Ну и естественно все это из 32-битного кода чтоб на x64 попадали в 64-битную ветку (на x86 соотв. в единственную).
Вроде все сформулировал. (важен каждый пункт сформулированного)

На .NET осилится? (не хочу как говорится "попу мучить", если у тебя рука набита быстро ответ дашь).
Но у меня нет 100% уверенности что ответ будет ДА хотя очень бы хотелось.

Просто SE_REGISTRY_WOW64_64KEY что я счас случайно нашел конечно хорошо (и "все давно вымучено"), но это только для Win10.
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39967276
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
using (RegistryKey hive = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
using (RegistryKey key = hive.OpenSubKey(@"SOFTWARE\7-Zip", writable: true))
{
	RegistrySecurity access = key.GetAccessControl();
	IdentityReference owner = access.GetOwner(typeof(NTAccount));
	Debug.Print(owner.Value);
	access.SetOwner(WindowsIdentity.GetCurrent().User);
	key.SetAccessControl(access);
}


хватит делать велосипед с квадратными колёсами, всё работает, лично проверил
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39967279
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Как группу "Users" вычислить? Вместо WindowsIdentity.GetCurrent().User
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39967291
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Код: c#
1.
SecurityIdentifier users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
...
Рейтинг: 0 / 0
Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
    #39967303
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
спасибо нашел уже.

Да так работает все что описал что надо:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Using hive As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
      Using key As RegistryKey = hive.OpenSubKey("MyKey", True)
        Dim access As RegistrySecurity = key.GetAccessControl()
        access.AddAccessRule(New RegistryAccessRule(New Security.Principal.SecurityIdentifier(Security.Principal.WellKnownSidType.BuiltinUsersSid, Nothing), _
         RegistryRights.ReadKey, InheritanceFlags.ContainerInherit Or InheritanceFlags.ObjectInherit, _
         PropagationFlags.None, AccessControlType.Allow))
        key.SetAccessControl(access)
      End Using
    End Using


Мне это не нравилось, потому что я всегда дублирую .NET 4.5 (для >=Vista) и .NET 2.0 (xp/2003) - пока от этой привычки не ушел.
Мне в данном случае надо только по условию >=Vista, но все одно придется комментировать код при делании .NET 2.0 exe-шника, чего я без крайней необходимости делать не люблю. В .NET 2.0 нету .OpenBaseKey и RegistryView.
Но это ладно, я подумаю.

А по поводу
"хватит делать велосипед с квадратными колёсами, всё работает, лично проверил",
там в .NET какая-то большая задница с взятием привелегии SE_TAKE_OWNERSHIP_NAME,
вот бодались когда-то:
А как в .Net обстоят дела с правами на объекты (реестр, файл...), сменой владельца и т.п.? ,
Но вот это точно продолжать обсуждать неохота.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Реестр, надо из 32-битного приложения сменить права/владельца 64-битной ветки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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