Отговорът на въпрос номер 78746

За да бъдем точни, аз съм на ANSI-Strings отказали:


функционира WTSQueryUserToken (идентификатор на сесия: pDWord; phToken: pHandle): BOOL; stdcall; външни "wtsapi32.dll";

процедура StartAsUser (Конст CMDLINE: низ);
Var
ч: THandle;
S: _StartupInfo;
р: _Process_Information;
започвам
WTSQueryUserToken (нула @h.);

s.cb: = SizeOf (S);
s.lpReserved: = нула;
s.lpDesktop: = "";
s.lpTitle: = нула;
s.dwFlags: = STARTF_USESHOWWINDOW;
s.wShowWindow: = SW_Show;
s.cbReserved2: = 0;
s.lpReserved2: = нула;

CreateProcessAsUser (Н нула. PChar (команден-ред),
нула. нула. невярно, CREATE_DEFAULT_ERROR_MODE, нула. нула. S, Р);

CloseHandle (p.hThread);
CloseHandle (p.hProcess);
CloseHandle (Н);
приключи;

Nishisha не работи, отстраняване на грешки не вижда символично информационна услуга - Фигури Повече и отстраняване на грешки.

Следвайте коментарите към този въпрос чрез RSS

GoogleUpdateTaskUserS-1-5-21-3221038988-1363763318-1264756050-1000Core
Гарантира, че софтуерът на Google актуална. Ако забраните или премахване на тази задача, софтуерът няма да бъдат актуализирани, което може да доведе до риск за сигурността, както и да доведе до факта, че някои функции да не работят. Тази задача се деинсталира сама, когато няма Google софтуер да го използвате.

GoogleUpdateTaskUserS-1-5-21-3221038988-1363763318-1264756050-1000UA
Гарантира, че софтуерът на Google актуална. Ако забраните или премахване на тази задача, софтуерът няма да бъдат актуализирани, което може да доведе до риск за сигурността, както и да доведе до факта, че някои функции да не работят. Тази задача се деинсталира сама, когато няма Google софтуер да го използвате.


Под XP, между другото, тече от името на администратора. И как те знаят паролата.
Под W7 просто стои чавки по-високи привилегии.

Вежди победи на монитор - да, това е ужас. Как мога да многообразие редове в Паскал получих. Много благодаря - notepad.exe веднага започнаха да се започне. Въпреки това, вашият код не може да се използва за този конкретен случай, защото той гарантира само две нула unikodovoy линия зад байта, а параметър функция lpCommandLine CreateProcessAsUser () трябва да бъде 4 (в unikodovoy версия) - това е написано в MSDN (за lpApplicationName не изисква това, тъй като няма параметри за синтактичен анализ в рамките CreateProcessAsUser () за него ). Т.е. Използвах

Вторият - проблемите на услугата. Така че аз знам :) Какво да се прави? Ще опиша проблема напълно и ясно. Може би има по-елегантно решение?

Това:
1. Налице е Win32-заявление predstalyayuschee на SOAP клиент е голям сървър. Комуникация със сървъра през HTTPS;
2. Прилагане в процеса на разпознаване е необходимо лично пръчка с ключа (още не действа, но планираното);
3. Заявлението може да работи с всякакъв вид Windows сметка - от Потребителя. Да се ​​предвиди, на това, което отчита, че ще достави - това е невъзможно;
4. Обхватът на OS - от 32-битова XP и по-горе, 64-битова версия, започващи с Vista;
5. Заявлението трябва да се провери за нови версии на себе си стартиране, както и периодично по време на работа. Ако откриете нова версия на насилствено и без показване на всяка Windows Update (в началото), или с което един прозорец "Quit" (по време на работа);
6. Процесът на обновяване трябва да се изключи всякаква действие на потребителя, но реакцията на "Quit" (не може да бъде принуден да затвори клиента, защото може да има незаписани данни;
7. Installer изисква администраторски права.

Решение, което взех:
1. Ако инсталационната програма се нуждае от администраторски права, а след това не "проста програма" не се актуализира, трябва едно с тези права са винаги по-висока, т.е. обслужване (кой друг?);
2. Уверете се, услугата като компактен (Напълно съм съгласен с всичко, което е написано от Лари Osterman) и минимално зависи от самото заявление, за да не се получи плетеница от зависимости. Ето защо е отказал никакво удостоверяване услуга на сървъра от самата GUI. Service трябва просто да се мотае в паметта и да чакам да бъде помолен да извърши нещо. Допълнителна ъпгрейд скрипт себе си.

Сценарий Client Актуализация

Скриптът за ъпгрейд започва по инициатива на клиента:
1. клиента в началото и / или периодично по време на работа сравнява версията с настоящата версия на клиента, който може да се намери чрез modUpdate (сървър модул такива dostuen чрез SOAP);
2. Ако те не са равни, клиентът подава заявка към сървъра за разрешение да се актуализира чрез modUpdate. Ако отговорът е да, продължете да се актуализира;
3. Вземете опаковката на новата версия на клиента чрез modUpdate;
4. Спестява distiributiv като файл в CSIDL_LOCAL_APPDATA \ DKClient папка с името setup.msi;
5. Изисква серер modUpdate чрез липсата на забрана за актуализацията с изтеглената версия (това е специален случай, тя се пропуснат - не значително). Ако забраната е в сила, не се предприемат действия. Ако забраната не е - продължава;
6. Доклади услуга за актуализиране (DKUpdate услуга) трябва да се актуализира;
7. автоматично спира (ако е на етапа на стартиране) или информира потребителя, че е необходимо за завършване на работата (ако актуализация е бил открит по време на работа на потребителя).

Сега изпълнението на скрипта от името на услугата за актуализация:
8. услуги чака за прилагане е затворен чрез откриване присъствието TDKClient32MainWindowClass клас прозорец в паметта;
9. Открива setup.msi папки CSIDL_LOCAL_APPDATA \ DKClient и CSIDL_LOCAL_APPDATA \ DKClient \ Current, ако поне един от файловете там - отменя актуализацията;
10. Започва деинсталационната CSIDL_LOCAL_APPDATA \ DKClient \ Current \ setup.msi / деинсталиране / мълчи. Когато деинсталирате инсталаторът стартира грешка CSIDL_LOCAL_APPDATA \ DKClient \ Current \ setup.msi / мълчи за да се възстанови по-стара версия на клиента, тя съхранява стойността в регистъра HKLM \ Software \ DKClient \ LASTUPDATE = "провали" (низ) и поставя началото на клиента. След успешното завършване, деинсталиране продължава;
11. Изпълнява инсталатор CSIDL_LOCAL_APPDATA \ DKClient \ setup.msi / мълчи, който съхранява стойността на регистъра HKLM \ Software \ DKClient \ AppPath (низ) пътя към основната документация за работата на клиента. Ако допуснете грешка обаче не приемат нищо повече. След успешното завършване, инсталаторът продължава;
12. Копие файла CSIDL_LOCAL_APPDATA \ DKClient \ setup.msi в CSIDL_LOCAL_APPDATA \ DKClient \ Current \ setup.msi. В случай на неуспех, нищо повече се приема. При успешно копиране продължава;
13. Изтрива файл CSIDL_LOCAL_APPDATA \ DKClient \ setup.msi;
14. Запазва стойността в регистъра HKLM \ Software \ DKClient \ LASTUPDATE = "успешен" (низ);
15. Изпълнение на нова версия на клиента с потребителя.

На следващо място, изпълнението на скрипта от името на клиенти:
16. Клиентът работи при стартиране проверява стойността на регистъра HKLM \ Software \ DKClient \ LASTUPDATE;
17. В случай на неуспешен ъпгрейд на клиента информира сървъра чрез modUpdate модул;
18. В случай на неуспешен ъпгрейд следващата автоматична актуализация се забави за известно време (например ден).

Този сценарий не се взема под внимание само начин за ъпгрейд на самата услуга obnoleniya. И как да се направи, че не е ясно - самата услуга няма да бъде в състояние да обновите по принцип, но приложението не може да се дължи на липса на права.

Първоначалната настройка включва изискване на допълнителна. авторитет и сервиз монтаж на актуализацията. В процеса на самообновяване услуга не се актуализира, въпреки че виси в разпределението. Сам distiributiv strandartny - InstallAware или инсталиране.

Service. Тази голяма статия, Александър, аз вчера да ischital дупки. И на всички въпроси на кръгла маса по този въпрос, също :)

Като цяло, тук е това, което стана. Тук е коригиран кода, с ума, който:


Var
Идентификатор на сесия: DWORD;
ч: THandle;
S: _StartupInfo;
р: _Process_Information;
б: LongBool;
започвам
Идентификатор на сесия: = WTSGetActiveConsoleSessionId;
// Тук идентификатор на сесия = 1; LasetError = 0

Н = 0;
б: = WTSQueryUserToken (@SessionID, @h);
// Тук б = фалшива; H = 0; LasetError = 2 (ERROR_FILE_NOT_FOUND)

s.cb: = SizeOf (S);
s.lpReserved: = нула;
s.lpDesktop: = "";
s.lpTitle: = нула;
s.dwFlags: = STARTF_USESHOWWINDOW;
s.wShowWindow: = SW_Show;
s.cbReserved2: = 0;
s.lpReserved2: = нула;

б: = CreateProcessAsUser (Н нула PChar (команден-ред) ,.
нула. нула. невярно, CREATE_DEFAULT_ERROR_MODE, нула. нула. S, Р);
// Ясно е, няма какво да се хванеш

CloseHandle (p.hThread);
CloseHandle (p.hProcess);
CloseHandle (Н);

ERROR_FILE_NOT_FOUND в отговор на WTSQueryUserToken. Идентификатор на сесия не може да се случи?

WTSQueryUserToken също може да върне грешка

ако не CreateProcessAsUser (.) и след това
RaiseLastOSError;

Не пишете услуга?

Ето отказ да ANSI: вместо _StartupInfoA използва _StartupInfo, добре, тя CreateProcessAsUser () функция е очевидно взети W. извади грешка, разбира се.
Делфи какво?

Грешки, освен чрез системния регистър или файла, за да изглеждат
Грешки могат да бъдат написани на EventLog или OutputDebugString

Ето отказ да ANSI: вместо _StartupInfoA използва _StartupInfo, добре, тя CreateProcessAsUser () функция е очевидно взети W. извади грешка, разбира се.

Грешки, освен чрез системния регистър или външния вид на файла - дебъгер свързва с гръм и трясък, но символично информация не виждам от близко разстояние. Как да се преодолее - XS.