Здравствуйте, egoroff, Вы писали:
E>Будте добры подсказать, каким образом я мог бы указать пользовательские разрешения доступа и запуска для своего сервера, не используя dcomcnfg, а непосредственно из программы при запуске сервера с параметром "-regserver"?
В принципе, dcomcnfg пишет информацию по вполне известному адресу в Реестре, а именно в одном подключе в разделе HKCR\AppID, соответствующему AppID твоего приложения. Поэтому почему бы и нет?! Если у тебя есть какой-нибудь rgs-файл, в котором приложение пишет свою информацию в Реестр, и ты сможешь через него записать
всю нужную информацию вместо dcomcnfg, то тем самым необходимость вызова dcomcnfg отпадает.
Например, если rec.rgs файл для приложения Rec.EXE, который формируется по умолчанию таким:
HKCR
{
NoRemove AppID
{
{610B38D4-577F-11D6-A449-004095426E66} = s 'Rec'
'Rec.EXE'
{
val AppID = s {610B38D4-577F-11D6-A449-004095426E66}
}
}
}
изменить на
HKCR
{
NoRemove AppID
{
{610B38D4-577F-11D6-A449-004095426E66} = s 'Rec'
{
val RunAs = s 'Interactive User'
}
'Rec.EXE'
{
val AppID = s {610B38D4-577F-11D6-A449-004095426E66}
}
}
}
то получим запуск под интерактивным пользователем. И т.д.
Какие ключи использует dcomcnfg для регистрации, можно посмотреть после пробного использования dcomcnfg на своем приложении.
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, egoroff, Вы писали:
[]
Это все прекрасно, но человеку нужно настроить
безопасность, а это значения LaunchPermission и AccessPermission.
Они представляют собой обыкновенные sd (security descriptors) в относительном формате. Работать с этим форматом можно с помощью функций MakeSelfRelativeSD и MakeAbsoluteSD.
Когда-то давно я писал тулзу по настройке всего этого хозяйства, но так и не дописал. Однако кое-что получилось:
void DumpKey(PCTSTR key_name)
{
CRegKey key;
if (key.Open(HKEY_CLASSES_ROOT,key_name) == ERROR_SUCCESS){
DWORD type_key = REG_BINARY;
PBYTE pbuf = (PBYTE)_alloca(1000);
DWORD len = 1000;
if (RegQueryValueEx(key,_T("AccessPermission"),0,
&type_key,pbuf,&len) == ERROR_SUCCESS){
if (type_key == REG_BINARY){
security::CPrivateSD sd;
sd.LoadFromSelfRelative(pbuf);
cout << sd;
}
}
}
}
...
DumpKey(_T("AppID\\{ххх}"));
Могу объяснить поподробнее работу классов. Может (если покапаюсь серьезно) собрать классы воедино и выложить в инет.