Răspunsul la întrebarea numărul 78746

Pentru a fi precis, eu sunt de ANSI-siruri de caractere refuzate:


funcționa WTSQueryUserToken (sessionid: pDWord; phToken: pHandle): bool; stdcall; 'Wtsapi32.dll' externă;

Procedura StartAsUser (const linie_cmd: string);
var
h: THandle;
s: _StartupInfo;
p: _Process_Information;
începe
WTSQueryUserToken (zero @h.);

s.cb: = sizeof (s);
s.lpReserved: = zero;
s.lpDesktop: = '';
s.lpTitle: = zero;
s.dwFlags: = STARTF_USESHOWWINDOW;
s.wShowWindow: = SW_Show;
s.cbReserved2: = 0;
s.lpReserved2: = zero;

CreateProcessAsUser (h, zero. PChar (linie_cmd),
zero. zero. fals, CREATE_DEFAULT_ERROR_MODE, zero. zero. s, p);

CloseHandle (p.hThread);
CloseHandle (p.hProcess);
CloseHandle (h);
se încheie;

Nishisha nu funcționează, debugger nu vede serviciul de informații simbolice - mai multe cifre și depanare.

Urmați orice răspunsurile la această întrebare prin RSS

GoogleUpdateTaskUserS-1-5-21-3221038988-1363763318-1264756050-1000Core
Asigură faptul că software-ul Google actualizat. Dacă dezactivați sau eliminați această sarcină, software-ul Google nu va fi actualizat, ceea ce poate duce la un risc de securitate, și să conducă la faptul că unele caracteristici pot să nu funcționeze. Această activitate se dezinstalează atunci când nu există nici un software Google.

GoogleUpdateTaskUserS-1-5-21-3221038988-1363763318-1264756050-1000UA
Asigură faptul că software-ul Google actualizat. Dacă dezactivați sau eliminați această sarcină, software-ul Google nu va fi actualizat, ceea ce poate duce la un risc de securitate, și să conducă la faptul că unele caracteristici pot să nu funcționeze. Această activitate se dezinstalează atunci când nu există nici un software Google.


Sub XP, de altfel, executați în numele administratorului. Și cum știu parola.
Sub W7 doar în picioare pe ceucă privilegii superioare.

Brow bate pe un monitor - da, a fost o groază. Cum pot diversitatea de rânduri în Pascal a primit. Multe mulțumiri - notepad.exe a început imediat să înceapă. Cu toate acestea, codul nu poate fi utilizat pentru acest caz particular, pentru că garantează doar două linia zero unikodovoy trailing octeți, și lpCommandLine CreateProcessAsUser funcția parametru () ar trebui să fie de 4 (în versiunea unikodovoy) - este scris în MSDN (pentru lpApplicationName nu impune acest lucru, deoarece nu există nici parametri de analizori din cadrul CreateProcessAsUser () pentru el ). Ie am folosit

Al doilea - problemele serviciului. Deci, eu știu :) Ce să fac? Voi descrie problema pe deplin și în mod clar. Poate că există o soluție mai elegantă?

Aceasta:
1. Există o aplicație Win32-predstalyayuschee un SOAP-client este un server de mare. Comunicarea cu serverul prin HTTPS;
2. Aplicarea în procesul de autentificare necesită stick-ul personal cu cheia (nu a implementat încă, dar planificate);
3. Aplicația poate lucra cu orice tip de cont Windows - din partea utilizatorului. Prevederea, pe ce cont va livra - este imposibil;
4. Intervalul de operare - de la 32 de biți XP și de mai sus, pe 64 de biți, începând cu Vista;
5. Cererea trebuie să verifice versiuni noi la pornire în sine, și periodic în timpul funcționării. Dacă găsiți o versiune nouă a forțat și fără a afișa orice actualizare ferestre (la început), sau aducerea o fereastră „Quit“ (în timpul operațiunii);
6. Procesul de actualizare ar trebui să excludă orice acțiune de utilizator, dar reacția la „Quit“ (nu poate fi forțat să închidă clientul, deoarece pot exista date nesalvate;
7. instalare necesită privilegii administrative.

O decizie pe care am luat:
1. În cazul în care programul de instalare are nevoie de drepturi de administrator, atunci nici un „program simplu“ nu actualizați, aveți nevoie de unul cu aceste drepturi sunt întotdeauna mai mari, de exemplu, serviciu (cine altcineva?);
2. Asigurați-vă serviciul ca compact (Sunt pe deplin de acord cu tot ceea ce este scris de Larry Osterman) și foarte puțin dependentă de cererea în sine, nu pentru a obține un amestec de interdependențe. Prin urmare, a refuzat orice autentificare serviciu pe server de GUI în sine. Serviciul ar trebui să stea doar în memorie și așteptați să vi se solicite să efectueze ceva. upgrade-ul în continuare script-ul în sine.

Actualizare Scenariul Client

Script-ul de upgrade începe inițiat de către client:
1. Clientul de la începutul și / sau periodic în timpul funcționării compară versiunea lor cu versiunea curentă a clientului, care pot fi găsite prin modUpdate (modulul server de astfel de dostuen prin intermediul SOAP);
2. În cazul în care acestea nu sunt egale, clientul interoghează serverul permisiunea de a actualiza prin intermediul modUpdate. Dacă da, continuați să actualizați;
3. Ia pachetul de noua versiune a clientului prin modUpdate;
4. Salvează distiributiv ca un fișier în folderul CSIDL_LOCAL_APPDATA \ DKClient numit setup.msi;
5. solicită Serer modUpdate prin lipsa unei interdicții privind actualizarea cu versiunea descărcată (aceasta este o situație specială, a omis - nu sunt semnificative). În cazul în care interdicția este în vigoare, nici o acțiune. În cazul în care interdicția nu este - continuă;
6. Rapoarte de servicii de actualizare (DKUpdate Service) trebuie să fie actualizate;
7. se oprește automat (dacă a fost în etapa de start) sau informează utilizatorul de necesitatea de a finaliza lucrările (în cazul în care a fost detectată o modificare în timpul funcționării utilizatorului).

Acum scriptul este executat în numele serviciului de actualizare:
8. așteaptă Serviciul de aplicare este închisă prin detectarea prezenței clasa ferestrei TDKClient32MainWindowClass în memorie;
9. Detectează setup.msi dosare CSIDL_LOCAL_APPDATA \ DKClient și CSIDL_LOCAL_APPDATA \ DKClient curent \, în cazul în care cel puțin unul dintre fișierele de acolo - anulează actualizarea;
10. Începe programul de dezinstalare CSIDL_LOCAL_APPDATA \ DKClient \ curent \ setup.msi / dezinstalare / silențios. Atunci când dezinstalați programul de instalare lansează eroare CSIDL_LOCAL_APPDATA \ DKClient \ curent \ setup.msi / silențios pentru a restabili o versiune mai veche a clientului, stochează valoarea în registrul HKLM \ Software \ DKClient \ LASTUPDATE = „a eșuat“ (string) și lansează clientul. După finalizarea cu succes, programul de dezinstalare continuă;
11. Rulează instalare CSIDL_LOCAL_APPDATA \ DKClient \ setup.msi / tăcut, care stochează valoarea (string) calea înregistrare HKLM \ Software \ DKClient \ AppPath la fișierul principal pentru a rula client. Dacă o eroare nu ia nimic mai mult. După finalizarea cu succes, programul de instalare continuă;
12. Copiați fișierul CSIDL_LOCAL_APPDATA \ DKClient \ setup.msi în CSIDL_LOCAL_APPDATA \ DKClient \ curent \ setup.msi. În caz de eșec, este luat nimic mai mult. După copierea cu succes continuă;
13. Șterge fișierul CSIDL_LOCAL_APPDATA \ DKClient \ setup.msi;
14. salvează valoarea de registry HKLM \ Software \ DKClient \ LASTUPDATE = "succes" (string);
15. Executați o nouă versiune a clientului cu utilizatorul.

Apoi, script-ul este executat în numele clienților:
16. Clientul se execută la pornire verifică valoarea de registry HKLM \ Software \ DKClient \ LASTUPDATE;
17. În cazul unei nereușite de upgrade clientul informeaza serverul prin intermediul modulului modUpdate;
18. În cazul unui upgrade de următoarea actualizare automată eșuată este amânată pentru ceva timp (de exemplu, zi).

Acest scenariu nu este luată în considerare numai modalitate de a actualiza serviciul în sine obnoleniya. Și cum se face nu este clar - serviciul în sine nu va putea actualiza, în principiu, dar cererea nu poate din cauza lipsei de drepturi.

Configurarea inițială implică solicitarea suplimentară. instalare autoritate și servicii de actualizare. În procesul de servicii de auto-reînnoire nu este actualizat, deși este agățat în distribuție. Sam distiributiv strandartny - InstallAware sau InstallShield.

Serviciu. Acest articol mare, Alexandru, am ieri să găuri ischital. Și toate întrebările mesei rotunde pe acest subiect, de asemenea :)

În general, iată ce sa întâmplat. Aici este codul corectat, cu mintea dreapta:


var
SessionId: DWORD;
h: THandle;
s: _StartupInfo;
p: _Process_Information;
b: LongBool;
începe
Sessionid: = WTSGetActiveConsoleSessionId;
// Aici sessionid = 1; LasetError = 0

h: = 0;
b: = WTSQueryUserToken (@SessionID, @h);
// Aici b = false; h = 0; LasetError = 2 (ERROR_FILE_NOT_FOUND)

s.cb: = sizeof (s);
s.lpReserved: = zero;
s.lpDesktop: = '';
s.lpTitle: = zero;
s.dwFlags: = STARTF_USESHOWWINDOW;
s.wShowWindow: = SW_Show;
s.cbReserved2: = 0;
s.lpReserved2: = zero;

b: = CreateProcessAsUser (h, zero PChar (linie_cmd) ,.
zero. zero. fals, CREATE_DEFAULT_ERROR_MODE, zero. zero. s, p);
// Este clar, nu este nimic pentru a prinde

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

ERROR_FILE_NOT_FOUND ca răspuns la WTSQueryUserToken. SessionId nu se poate întâmpla?

WTSQueryUserToken poate reveni, de asemenea, o eroare

dacă nu CreateProcessAsUser (.) atunci
RaiseLastOSError;

Nu scrii serviciu?

Iată refuzul de a ANSI: în loc _StartupInfoA utilizate _StartupInfo, bine, funcția ea CreateProcessAsUser () este luată în mod evident, W. scos o greșeală, desigur.
Delphi ce?

Erori cu excepția prin intermediul registrului sau fișierul să se uite
Erorile pot fi scrise în EVENTLOG sau OutputDebugString

Iată refuzul de a ANSI: în loc _StartupInfoA utilizate _StartupInfo, bine, funcția ea CreateProcessAsUser () este luată în mod evident, W. scos o greșeală, desigur.

Erori cu excepția prin intermediul registrului sau aspectul de fișier - debugger se conectează cu un bang, dar informația simbolică nu văd de aproape. Cum de a depăși - xs.