Как я могу декодировать значение REG_BINARY HKLM \ Software \ Microsoft \ Ole \ DefaultLaunchPermission, чтобы увидеть, какие пользователи имеют разрешение? - PullRequest
1 голос
/ 22 апреля 2009

Я пытаюсь найти способ декодировать значение REG_BINARY для " HKLM \ Software \ Microsoft \ Ole \ DefaultLaunchPermission ", чтобы увидеть, какие пользователи имеют разрешения по умолчанию, и, если возможно, метод, в котором Я также могу добавлять других пользователей по имени пользователя.

На работе мы используем DCOM и по большей части мы всегда даем разрешение одним и тем же пользователям, но в некоторых случаях мы вынуждены приспосабливаться к нашим клиентам и добавлять пользовательских пользователей / группы в соответствии с их потребностями. К сожалению, нестандартные пользователи, которые нам нужно добавить, являются случайными именами пользователей, поэтому я не могу просто добавить всех пользователей и скопировать значение из ключа, как я делал с пользователями по умолчанию, которые мы используем в 95% случаев.

В настоящее время я работаю над исполняемым приложением командной строки, в котором у меня есть команда для установки разрешений для предопределенных пользователей, но я также хотел бы иметь возможность добавить опцию для добавления пользовательских пользователей для добавления в разрешение по умолчанию вместе с нашим предопределенным списком пользователей по умолчанию.

В настоящее время, чтобы установить список пользователей по умолчанию в моем приложении, я просто набрал:

Политики MyTool.exe

Но я бы хотел сделать его более многословным, ближе к тому, как команда NET используется для пользователей Windows, что-то вроде:

Политики MyTool.exe / ДОБАВИТЬ: «MyCustomUsername»

Проблема в том, что данные, хранящиеся в значении REG_BINARY, не кажутся легко декодируемыми. Мне удалось декодировать шестнадцатеричную часть в python, но у меня остались какие-то двоичные данные, с которыми я понятия не имею, что делать, поскольку я даже не знаю, какое кодирование использовалось в первую очередь для знать, что использовать для его декодирования. : Р

Я немного погуглил, но, думаю, мое непонимание терминологии по этой теме, вероятно, привело к тому, что я пропустил ответ, не признав его таким, какой он есть.

Полагаю, моим первым реальным вопросом должно быть то, какая кодировка используется для указанного выше ключа после того, как он был декодирован из шестнадцатеричного кода?

Или, что еще лучше, возможно ли даже получить / изменить значение ключа программно, чтобы я мог получить список пользователей, которые в настоящее время установлены, и, если необходимо, добавить дополнительных пользователей / группы?

Я бы предпочел, чтобы это приложение было написано строго на Python, если это возможно (или WMI / WMIC), но при необходимости я могу попытаться внедрить другие типы кода в мое приложение на Python, если это означает, что работа должна быть окончательно выполнена! Полагаю, было бы также полезно упомянуть, что это приложение в основном используется в Windows XP Professional и большинстве версий Windows Server, поэтому я не беспокоюсь, если какое-либо возможное решение не будет совместимо с более ранними версиями ОС Windows.

Любая помощь, код или просто простая помощь в знакомстве с этой темой, будет БОЛЬШОЙ признательна!

Заранее спасибо за любую помощь, которую вы можете предоставить! : D

Ответы [ 2 ]

2 голосов
/ 22 апреля 2009

Мы столкнулись с похожими проблемами при установке COM-сервера, который был размещен в нашей службе .NET, то есть мы хотели программно изменить COM ACL в нашей логике установки. Я думаю, вы обнаружите, что это просто двоичный формат ACL, которым вы можете манипулировать в .NET, используя класс:

System.Security.AccessControl.CommonSecurityDescriptor

Извините, я не могу помочь вам в получении решения на Python, но если вы спиной к стене и вы можете управлять .NET, некоторый пример кода будет выглядеть так:

int launchMask = (int) (COM_RIGHTS.EXECUTE | COM_RIGHTS.EXECUTE_LOCAL | COM_RIGHTS.ACTIVATE_LOCAL);

SecurityIdentifier sidAdmins = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
SecurityIdentifier sidInteractive = new SecurityIdentifier(WellKnownSidType.InteractiveSid, null);

DiscretionaryAcl launchAcl = new DiscretionaryAcl(false, false, 3);
launchAcl.AddAccess(AccessControlType.Allow, sidAdmins, launchMask, InheritanceFlags.None, PropagationFlags.None);
launchAcl.AddAccess(AccessControlType.Allow, sidInteractive, launchMask, InheritanceFlags.None, PropagationFlags.None);

CommonSecurityDescriptor launchSD = new CommonSecurityDescriptor(false,
                                                                    false,
                                                                    ControlFlags.DiscretionaryAclPresent | ControlFlags.SelfRelative,
                                                                    sidAdmins,
                                                                    sidAdmins,
                                                                    null,
                                                                    launchAcl);


byte[] launchPermission = new byte[launchSD.BinaryLength];
launchSD.GetBinaryForm(launchPermission, 0);

Затем вы берете байтовый массив разрешений на запуск и записываете его в реестр. Если .NET не является началом, вы можете хотя бы взглянуть на то, как работают классы .NET, и посмотреть, какие функции win32 они используют. Вы можете использовать инструмент рефлектор для просмотра соответствующей сборки или MSFT опубликовать источник .NET .

0 голосов
/ 22 апреля 2009

Ну, REG_BINARY - это не какой-то конкретный формат, это просто способ сообщить реестру, что данные представляют собой пользовательский двоичный формат. Так что вы правы в том, что вам нужно выяснить, что там.

Кроме того, что вы подразумеваете под преобразованием данных из шестнадцатеричного числа? Вы распаковываете это? Я сомневаюсь, что вы интерпретируете это правильно, пока не узнаете, что там было сохранено.

Как только вы узнаете, что находится в этом поле реестра, структурный модуль python станет вашим лучшим другом.

http://docs.python.org/library/struct.html

Дальнейшее чтение (вы, вероятно, уже видели это)

...