на главнуюВсе эхи RU.DELPHI
войти ?

D7.WinAPI:Сериализация дескриптора безопасности

От Dmytry Ginzburg (2:461/48.125) к All

В ответ на Заголовок предыдущего сообщения в треде (Имя Автора)


Здравствуйте, о моногоуважаемый(ая), All!
Вот.. Hабил письмецо.. А вот, что из этого вышло:
Ещё раз всем привет. Итак ситуация. Есть написанная мной служба, которая обращается к удалённому DCOM-серверу. Соответственно, при инсталляции нужно выставить права на серверной и клиентской машине. Причём те, кто будут с прогой работать, руками могут настроить такого, что ой-ой, поэтому решил установку прав заложить в инсталлянт. Собственно, при регистрации службы хочу выставить на клиентской машине такие права DCOM:
1)Подключение: LocalSystem - разрешить локальную активацию и локальный запуск
Службы - разрешить локальную активацию, локальный запуск, удалённый запуск, удалённую активацию.
2)Доступ:LocalSystem и Self - разрешить локальный доступ, Службы - разрешить локальный и удалённый доступ.
Сделал следующее. Hастроил эти права на моей машине, проверил, что всё работает, а затем выгрузил настройки в текстовый вид из ключей LaunchPermission и AccessPermission моего AppID в реестре с помощью функции ConvertSecurityDescriptorToStringSecurityDescriptor. Получил следующие константы:
_!--==> А тута Windows Clipboard начинается... <==--!_
const
AccessPermission='O:BAG:BAD:(A;;CCDCLC;;;PS)(A;;CCDC;;;SY)(A;;CCDCLC;;;SU)';
LaunchPermission='O:BAG:BAD:(A;;CCDCSW;;;SY)(A;;CCDCLCSWRP;;;SU)';
_!--==> А тута Windows Clipboard заканчивается... <==--!_
Это хорошо. Теперь в методе BeforeInstall моего сервиса записываю обратно в реестр c помощью функции ConvertStringSecurityDescriptorToSecurityDescriptor, которую определил так
_!--==> А тута Windows Clipboard начинается... <==--!_
function ConvertStringSecurityDescriptorToSecurityDescriptor(StringSecurityDescr iptor:PChar;StrringSDRevision:DWORD;out SecurityDescriptor:Pointer;out SecurityDescriptorSize:DWORD):BOOL;stdcall;external 'advapi32.dll' name 'ConvertStringSecurityDescriptorToSecurityDescriptorA';
_!--==> А тута Windows Clipboard заканчивается... <==--!_
Код для записи довольно простой:
_!--==> А тута Windows Clipboard начинается... <==--!_
for i:=0to appids.Count-1 do
if reg.OpenKey('\'+key+'\'+appids.Strings[i],false)then
begin
s:=reg.ReadString('');
if s='uniopc'then//Hахожу нужный мне AppID
begin
if ConvertStringSecurityDescriptorToSecurityDescriptor(PChar(AccessPermission),1 ,AccessDescriptor,l)then reg.WriteBinaryData('AccessPermission',AccessDescriptor,l);
ifConvertStringSecurityDescriptorToSecurityDescriptor(PChar(LaunchPermission),1 ,LaunchDescriptor,l)then reg.WriteBinaryData('LaunchPermission',LaunchDescriptor,l);
reg.CloseKey;
end;
end;
_!--==> А тута Windows Clipboard заканчивается... <==--!_
Hо почему-то в реестр вместо того, что мне нужно, записывается мусор, т.к. при попытке просмотреть подобные права через оснастку Службы компонентов, mmc благополучно валится в AV, пытаясь прочитать значение дескриптора безопасности из реестра. Покурив MSDN, я было подумал, что дело в том, что дескриптор должен храниться в абсолютном формате, а функция возвращает self-relative. Hо запросив формат правильно хранящегося в реестре дескриптора c помощью GetSecirityDescriptorControl, я получаю код $8004, т.е. он там и хранится в виде self-relative. Как же его правильно записать в реестр без ошибок из текстового вида в бинарный?
Желаю Вам всего наилучшего, All.Дмитрий.

--- Вот такой вот наглый Дед со стажем в 3.0.1-asa9 SR1 лет!
* Origin: Default ORIGIN (FidoNet 2:461/48.125)

Ответы на это письмо:

From: Username
Заголовок следующего сообщения в треде может быть длинным и его придется перенести на новую строку

From: Username
Или коротким

FGHI-url этого письма: area://RU.DELPHI?msgid=2:461/48.125@FidoNet+4a1746a8