[C win32] callers context

Pagina: 1
Acties:

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 19:01
Hoe bepaal ik of een normale gebruiker een programma aanroept, of de service control manager?

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

GetUserName() of GetUserNameEx()

Zie:
Platform SDK Documentation/Windows API/Reference/Functions by Category

en dan de System Information section.

(Found in 4 seconds :P)

edit:

Een service draait onder een zekere user. Draai je die service onder bv "System" dan kun je zo bepalen of de current user van de current thread de SCM is of een interactieve user. Een service is in feite gewoon een executable die draait in een andere context dan de ingelogde user, dus niet een 'speciale', maar een 'andere'. Een commandline parameter voor je service zou ook nog kunenn

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 19:01
GetUserName() :?
Ik snap wat je bedoeld Otis (je "edit" is overbodig, maar toch bedankt), maar dat gaat niet werken -> zie commentaar beneden.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 19:01
Vraagje tussendoor:

Waarom lijkt het starten van een service _veel_ langer te duren dan starten van een normale applicatie?

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

Geen idee. Ik denk dat win32 intern wat structures moet vullen met gegevens plus dat de service starter process wacht op signals van het process dat hij klaar is met initialiseren. Het hangt van de service af hoor. mercury mailserver die ik met een firedaemon 'service runner' start is binnen een seconde op, IIS duurt eeuwen. :)

Ik weet niet hoe jij je service initialiseert, maar als je bv je initialisatie in een workerthread start en de main thread accuut laat retourneren is je service veel sneller opgestart.

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 19:01
Voor stoppen heb ik een aparte thread*, voor starten niet. Voor het starten worden alleen wat memory allocaties gedaan, daarna wordt de hoofdthread gestart en vervolgens gerapporteerd dat de service gestart is.


* de eerste 10 seconde vraagt deze netjes aan de runnende thread of deze wil stoppen, daarna 5 seconden lang wat aggresiever door alle synchronisatie objecten op signalled te zetten en als 'ie daarna nog niet afgesloten is dan worden de threads bruut gekilled

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 19:01
Om weer terug te komen bij mijn oorspronkelijke vraag:
Een functie als GetUserName(Ex) gaat niet werken, want het is niet voldoende om naar je eigen security context te kijken of je door de SCM wordt aangeroepen, aangezien de user waaronder je het programma runt als service wel eens dezelfde user kan zijn die het programma via de explorer, cmdline of snelkoppeling start. Nu zou je kunnen zeggen dat je dan maar een andere gebruiker moet gebruiken/aanmaken om het programma als service te runnen (daar kan je nog een hele discussie over houden maar dat heeft niets met P&W te maken), maar in dat geval had ik net zo goed een commandline optie kunnen gebruiker (wat ik dus al deed) en zou deze vraag overbodig zijn. Dus de vraag is iets minder triviaal dan je dacht *D

Waar ik op doelde is niet zozeer de security context van het eigen programma, maar de "context" van het process (zoals bijvoorbeeld de naam van de executable of misschien andere eigenschappen waarmee je de SCM kan onderscheiden) dat het programma aanroept. Ik weet n.m.l. niet of je daar informatie kan over opvragen?
Ik kan me namelijk conceptueel voorstellen dat de SCM een (non-blocking!) CreateProcess doet (en vervolgens gaat wachten op een of andere message ofzo). Maar als je met een non-blocking CreateProcess een process start, dan hoeft vanuit dat process vandaan het aanroepde process niet meer te bestaan...

Iemand commentaar, ideeën of een oplossing?

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]

Pagina: 1