Синхронизация процессов
От: PVN Россия  
Дата: 18.11.06 09:11
Оценка:
Задача казалась типичной — автоматическое обновление и рестарт программы:
Алгоритм следующий:
1. Программа выявляет необходимость обновления и запускает вспомательную программу синхронизации autoupg.exe.
2. Эта вспомогательная программа является средсвом синхронизации: ждет, когда завершится основная программа, создает процесс для запуска setup.exe от имени пользователя, имеющего такие права(функция CreateprocessWithLogonW), ждет завершения обновления(WaitForSingleObject), проверяет результат обновления через реестр и осуществляет рестарт основной программы.
Все было бы хорошо, если бы setup.exe не создавл еще одного процесса — в результате рестарт начинается до обновления программы.
Вопрос в следующем — как получить handle этого процесса?
Попытка использовать EnumProcess — OpenPrpcess оказалась неудачной — отказано в доступе.
Setup чужой, вставить в него что-то типа Event не могу.
Re: Синхронизация процессов
От: grigsoft Беларусь http://www.grigsoft.ru/
Дата: 18.11.06 11:40
Оценка:
Я бы тупо ждал значения реестра, проверяя раз в пол-секунды.
Re[2]: Синхронизация процессов
От: elGeminy  
Дата: 18.11.06 11:46
Оценка:
Здравствуйте, grigsoft, Вы писали:

G>Я бы тупо ждал значения реестра, проверяя раз в пол-секунды.


Ну тогда уж лучше повеситься на изменение нужной ветки — RegNotifyChangeKeyValue
Re: Синхронизация процессов
От: Alexey Frolov Беларусь  
Дата: 18.11.06 13:08
Оценка:
Здравствуйте, PVN, Вы писали:

PVN>Попытка использовать EnumProcess — OpenPrpcess оказалась неудачной — отказано в доступе.


По поводу этой части вопроса:

Предполагаю, что это работает под w2k, где по умолчанию доступ к процессу отсутствует у всех кроме SYSTEM (на 100% не уверен, но что то вроде того). Если OpenProcess выполняется под административной учетной записью, то можно сделать следующий ход. Открываем процесс для изменения прав доступа, даем доступ всем, затем открываем процесс для terminate. Вот примерный код.


    HANDLE hProcess = OpenProcess( WRITE_DAC, FALSE, ssp.dwProcessId );
    if (hProcess)
    {
        TCHAR strNewSd[1024] = "D:(A;;FA;;;WD)";
        PSECURITY_DESCRIPTOR pSd;
        DWORD dwSdLen = 0;
        BOOL bYes = ConvertStringSecurityDescriptorToSecurityDescriptor(strNewSd, SDDL_REVISION_1, &pSd, &dwSdLen);
        bYes = SetKernelObjectSecurity(hProcess, DACL_SECURITY_INFORMATION, pSd);
        LocalFree(LocalHandle(pSd));
        CloseHandle(hProcess);

        hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, ssp.dwProcessId );
        if (hProcess)
        {
            TerminateProcess(hProcess, 0);
            CloseHandle(hProcess);
        }
    }
Re[3]: Синхронизация процессов
От: Alexey Frolov Беларусь  
Дата: 18.11.06 13:10
Оценка: +1
Здравствуйте, elGeminy, Вы писали:

G>Здравствуйте, grigsoft, Вы писали:


G>>Я бы тупо ждал значения реестра, проверяя раз в пол-секунды.


G>Ну тогда уж лучше повеситься на изменение нужной ветки — RegNotifyChangeKeyValue


А вообще дождаться окончания — это несомненно более правильное решение, чем уничтожать процесс
Re[2]: Синхронизация процессов
От: PVN Россия  
Дата: 19.11.06 08:06
Оценка:
Здравствуйте, Alexey Frolov, Вы писали:

AF>Здравствуйте, PVN, Вы писали:


PVN>>Попытка использовать EnumProcess — OpenPrpcess оказалась неудачной — отказано в доступе.


AF>По поводу этой части вопроса:


AF>Предполагаю, что это работает под w2k, где по умолчанию доступ к процессу отсутствует у всех кроме SYSTEM (на 100% не уверен, но что то вроде того). Если OpenProcess выполняется под административной учетной записью, то можно сделать следующий ход. Открываем процесс для изменения прав доступа, даем доступ всем, затем открываем процесс для terminate. Вот примерный код.


К сожалнию OpenProcess выполняется не под административной учетной записью, в том то и смысл — пользователь имеет ограниченные права, поэтому запускается процесс от имени другого пользователя.

Может попробовать OpenProcessToken для первого процесса(handle знаю,т.к.создаю его сам) и ImpersonateLoggedOnUser перед открытием второго процесса?
Re[3]: Синхронизация процессов
От: PVN Россия  
Дата: 19.11.06 17:31
Оценка:
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:

HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

Типичеый вызов функции (пример из этого форума)
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) ?
Re[4]: Синхронизация процессов
От: Аноним  
Дата: 19.11.06 17:59
Оценка:
PVN>Что такое predefined keys (HKEY_CLASSES_ROOT,etc) ?
Это 'числовые' константы.
#define HKEY_CLASSES_ROOT (( HKEY ) (ULONG_PTR)((LONG)0x80000000) )
#define HKEY_CURRENT_USER (( HKEY ) (ULONG_PTR)((LONG)0x80000001) )
#define HKEY_LOCAL_MACHINE (( HKEY ) (ULONG_PTR)((LONG)0x80000002) )
#define HKEY_USERS (( HKEY ) (ULONG_PTR)((LONG)0x80000003) )
#define HKEY_PERFORMANCE_DATA (( HKEY ) (ULONG_PTR)((LONG)0x80000004) )
#define HKEY_PERFORMANCE_TEXT (( HKEY ) (ULONG_PTR)((LONG)0x80000050) )
#define HKEY_PERFORMANCE_NLSTEXT (( HKEY ) (ULONG_PTR)((LONG)0x80000060) )
Re[5]: Синхронизация процессов
От: PVN Россия  
Дата: 19.11.06 18:41
Оценка:
Здравствуйте, Аноним, Вы писали:

PVN>>Что такое predefined keys (HKEY_CLASSES_ROOT,etc) ?

А>Это 'числовые' константы.
А>#define HKEY_CLASSES_ROOT (( HKEY ) (ULONG_PTR)((LONG)0x80000000) )
А>#define HKEY_CURRENT_USER (( HKEY ) (ULONG_PTR)((LONG)0x80000001) )
А>#define HKEY_LOCAL_MACHINE (( HKEY ) (ULONG_PTR)((LONG)0x80000002) )
А>#define HKEY_USERS (( HKEY ) (ULONG_PTR)((LONG)0x80000003) )
А>#define HKEY_PERFORMANCE_DATA (( HKEY ) (ULONG_PTR)((LONG)0x80000004) )
А>#define HKEY_PERFORMANCE_TEXT (( HKEY ) (ULONG_PTR)((LONG)0x80000050) )
А>#define HKEY_PERFORMANCE_NLSTEXT (( HKEY ) (ULONG_PTR)((LONG)0x80000060) )

Спасибо !!!
Все работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.