Задача казалась типичной — автоматическое обновление и рестарт программы:
Алгоритм следующий:
1. Программа выявляет необходимость обновления и запускает вспомательную программу синхронизации autoupg.exe.
2. Эта вспомогательная программа является средсвом синхронизации: ждет, когда завершится основная программа, создает процесс для запуска setup.exe от имени пользователя, имеющего такие права(функция CreateprocessWithLogonW), ждет завершения обновления(WaitForSingleObject), проверяет результат обновления через реестр и осуществляет рестарт основной программы.
Все было бы хорошо, если бы setup.exe не создавл еще одного процесса — в результате рестарт начинается до обновления программы.
Вопрос в следующем — как получить handle этого процесса?
Попытка использовать EnumProcess — OpenPrpcess оказалась неудачной — отказано в доступе.
Setup чужой, вставить в него что-то типа Event не могу.
Здравствуйте, PVN, Вы писали:
PVN>Попытка использовать EnumProcess — OpenPrpcess оказалась неудачной — отказано в доступе.
По поводу этой части вопроса:
Предполагаю, что это работает под w2k, где по умолчанию доступ к процессу отсутствует у всех кроме SYSTEM (на 100% не уверен, но что то вроде того). Если OpenProcess выполняется под административной учетной записью, то можно сделать следующий ход. Открываем процесс для изменения прав доступа, даем доступ всем, затем открываем процесс для terminate. Вот примерный код.
Здравствуйте, elGeminy, Вы писали:
G>Здравствуйте, grigsoft, Вы писали:
G>>Я бы тупо ждал значения реестра, проверяя раз в пол-секунды.
G>Ну тогда уж лучше повеситься на изменение нужной ветки — RegNotifyChangeKeyValue
А вообще дождаться окончания — это несомненно более правильное решение, чем уничтожать процесс
Здравствуйте, Alexey Frolov, Вы писали:
AF>Здравствуйте, PVN, Вы писали:
PVN>>Попытка использовать EnumProcess — OpenPrpcess оказалась неудачной — отказано в доступе.
AF>По поводу этой части вопроса:
AF>Предполагаю, что это работает под w2k, где по умолчанию доступ к процессу отсутствует у всех кроме SYSTEM (на 100% не уверен, но что то вроде того). Если OpenProcess выполняется под административной учетной записью, то можно сделать следующий ход. Открываем процесс для изменения прав доступа, даем доступ всем, затем открываем процесс для terminate. Вот примерный код.
К сожалнию OpenProcess выполняется не под административной учетной записью, в том то и смысл — пользователь имеет ограниченные права, поэтому запускается процесс от имени другого пользователя.
Может попробовать OpenProcessToken для первого процесса(handle знаю,т.к.создаю его сам) и ImpersonateLoggedOnUser перед открытием второго процесса?
G>Ну тогда уж лучше повеситься на изменение нужной ветки — RegNotifyChangeKeyValue
Идея мне понравилась , особенно в сочетании с Event и WaitForSingleObject.
Но уперся при реализации в функцию RegOpenKeyEx. Программа на PowerBuilder и проблема видимо с типами данных.
По документации
LONG RegOpenKeyEx(
HKEY hKey,
LPCTSTR lpSubKey,
DWORD ulOptions,
REGSAM samDesired,
PHKEY phkResult
);
hKey — A handle to an open registry key,it can be one of the following predefined keys:
Типичеый вызов функции (пример из этого форума)
RegOpenKeyEx(
HKEY_CLASSES_ROOT ,
"\\CLSID\\{bla..bla}\\Version",
0,
KEY_QUERY_VALUE ,
&Temp );
в PowerBuilder таких констант естественно нет.
Я пытаюсь передать указатель на строку например, 'HKEY_LOCAL_MACHINE' -> System Error code — 6 Неверный дескриптор.
Что такое predefined keys (HKEY_CLASSES_ROOT,etc) ?