Autor Beitrag
prote
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 17



BeitragVerfasst: Sa 16.04.05 00:02 
Der Titel sagt alles: ich könnte dazu mal ein paar Infos vertragen und finde irgendwie nichts brauchbares :roll:
Ich vermute mal, daß man das ganze lediglich über die Registry löst, bin mir da allerdings nicht wirklich sicher und weiß auch nich, ob ich dort alle nötigen Einträge ohne 'ne Anleitung reingeschummelt bekomme ^^ und gleich noch eine 2. Frage hinterher: darf ein Systemdienst eine Form haben oder muß ich Ein-/Ausgaben über ein zusätzliches "normales" Programm lösen?

Edit: habe doch noch eine Lsg. gefunden, auch goglen will gelernt sein ^^ Wen's interessiert: www.seti-ost.de/inde...ue=12&Artikel=14 und wer jetzt plötzlich für seti rechnen will, möge doch büdde zu setigermany gehen, für die hatte auch ich ein paar CPU-Jahre gesponsort *g* ... back2topic: falls jemand noch eine bessere Lösung hat, als diese manuelle, dann immer her damit ;)
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Sa 16.04.05 08:42 
hast du schonmal hier im forum nach Suche in: Delphi-Forum, Delphi-Library SERVICE oder Suche in: Delphi-Forum, Delphi-Library DIENST gesucht ? da wirste fast erschlagen !

_________________
In the beginning was the word.
And the word was content-type: text/plain.
prote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 17



BeitragVerfasst: Sa 16.04.05 20:07 
Nun, da findet man einiges *g* nur leider nix, was mir wirklich weiterhilft. Also mal genaues zum Problem:
- ich habe ein Tool x mit Fenster und allem mgl. Zusatzzeugs
- das Tool x soll automatisch gestartet werden
- sämtliche Win-Autostarts sind ausgeschlossen, da auf dem Zielsystem irgendwie deaktiviert

Daher hielt ich den Start über einen Systemdienst für eine brauchbare Lsg. Naja, nur klappt das irgendwie nicht :? Ich habe als Dienst folgendes verwendet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
program x2;
uses ShellApi,Windows,SvcMgr;
var h:integer; //handle
    p:integer;
begin
 p:=5000;
 while true do begin
  sleep(p);
  h:=FindWindow('x1',nil);
  if not(isWindow(h))then begin
   ShellExecute(h, '', 'x1.exe','','c:\programme\x\', SW_SHOWNORMAL);
//   p:=60000; //nur noch 1x/min testen, ob das Tool läuft
  end;
 end;
end.

x und x1/x2 steht für die Namen der Tools und ja, die sind einzigartig (kann sein, daß ich das jetzt hier beim Ersetzen irgendwo verdreht habe, im Orig stimmt's aber). Der kleine Source hier zum Starten des anderen Tools funktioniert jedenfalls - aber nur, wenn ich das "Service-Tool" unter Win manuell aufrufe. Als Service ruft das Ding zwar auch mein Tool auf, aber ich komme irgendwie nicht an meine Oberfläche (also das Form) ran, auch Tastenabfragen um Form.Visible:=true zu setzen, haben nix gebracht.

Ach ja, hier noch der Source für die Inst. des Service:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
const pt_dir='c:\programme\x\';
 ...
 regist:=TRegistry.Create;
 if CheckBox8.Checked then try
  regist.RootKey:=HKEY_LOCAL_MACHINE;
  if not regist.KeyExists('\System\CurrentControlSet\Services\x1')then begin
   ShellExecute(handle,'','instsrv','x1 '+pt_dir+'srvany.exe',pt_dir,SW_HIDE);
   regist.OpenKey('\System\CurrentControlSet\Services\x1',true);
   regist.WriteString('Description','...');
   regist.OpenKey('\System\CurrentControlSet\Services\x1\Parameters',true);
   regist.WriteString('AppDirectory',pt_dir);
   regist.WriteString('Application','x1.exe');
  end;
 finally
  regist.CloseKey;
  regist.Free;
  inherited;
 end else try
  regist.RootKey:=HKEY_LOCAL_MACHINE;
  if regist.KeyExists('\System\CurrentControlSet\Services\x1')then begin
   regist.DeleteKey('\System\CurrentControlSet\Services\x1');
   ShellExecute(handle,'','instsrv','x1 remove',pt_dir,SW_HIDE);
  end;
 finally
  regist.CloseKey;
  regist.Free;
  inherited;
 end


Tjo, hat jemand 'ne Idee? :roll: Vielleicht geht's ja über die von Delphi zur Verfügung gestellten Rohgerüste zur Erstellung eines Service besser, nur habe ich dafür leider in meinen Büchern keine brauchbare Anleitung gefunden und sämtliche Treffer von der Suche von matze einzeln durcharbeiten - öhm ... *g* neee - Die 1. Seite hat mir gereicht ;) Hat da jemand evtl. 'nen Link griffbereit?

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.

Edit: mir ist gerade aufgefallen, daß das zu startende Tool ebenfalls unter der Userkennung "SYSTEM" läuft. Das ist natürlich doof und die Änderung könnte zur Lösung des Problems genügen - aber wie kann ich das ändern? :roll:

Edit2: ok, nach einigem Überlegen fiel mir ein, daß es da noch den runas-Befehl gibt, nur will der leider ein (nicht vorhandenes) Paßwort ^^ Dieses könnte man per SendKeys etc. reinjonglieren. Weitere Alternativen sind mir dank der glorreichen Suchfunktion in Form von CreateProcessAsUser und CreateProcessWithLogonW begegnet. Ich werde morgen mal damit herumexperimientieren und so ich's nicht hinbekomme, nerve ich hier noch mal :lol:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 17.04.05 02:14 
user profile iconprote hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
  h:=FindWindow('x1',nil);					


Das kann nicht funktionieren. Der Dienst läuft in einer anderen WindowsStation, er sieht dein Programm-Fenster also gar nicht, was ja auf der WinStat0 (der einzig interaktiven) auf dem Default Desktop läuft.
prote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 17



BeitragVerfasst: So 17.04.05 04:47 
mhhh ... :roll: naja, da wäre aber dann immer noch ein anderes Problem: demzufolge müßte der Dienst das zu startende Tool immer aufrufen, weil er ja das Fenster nicht sieht. Tut er aber nicht :? Aber danke für den Tip, wenn ich mein aktuelles Prob gelöst habe, dürfte somit das nächste an der Reihe sein :lol:

Also, der Source sieht jetzt so aus:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
program hilfstool;
uses JwaWinBase,JwaWinUser;//,dialogs,sysutils - nötig für die Fehlerausgabe
var h:integer; //handle bzw. hwnd
    p:integer;
    si:_STARTUPINFOW;
    pif:PROCESS_INFORMATION;
    res:LongBool;
//    s:string; //für Fehlerausgabe
begin
 p:=5000;
 while true do begin
  sleep(p);
  h:=FindWindow('tollestool',nil);
  if not(isWindow(h))then begin
  si.cb:=SizeOf(startupinfow);
  si.dwFlags:=STARTF_USESHOWWINDOW;
  si.wShowWindow:=SW_SHOWDEFAULT;
  si.lpReserved:=nil;
  si.lpDesktop:=nil;
  si.lpTitle:='Konsole';
  res:=CreateProcessWithLogonW('admin','','wertfred',LOGON_WITH_PROFILE,
   'c:\programme\tollestool\tollestool.exe','c:\programme\tollestool\',
   CREATE_DEFAULT_ERROR_MODE,nil,nil,si,pif);
  if not(res)then begin
//Fehlercode könnte so ausgegeben werden:
{   str(GetLastError,s);
   ShowMessage('CreateProcessWithLogonResult: '+inttostr(ord(res))+#10+
    'GetLastError: '+s+#10+SysErrorMessage(GetLastError));
}
  end;
   p:=60000; //nur noch 1x/min testen, ob das Tool läuft
  end;
 end;
end.

Wenn ich das Ding manuell starte (bin mit anderem Login angemeldet), dann startet dieses "hilfstool" problemlos das "tollestool" unter dem User admin. Läuft das "hilfstool" als Dienst (also SYSTEM), dann passiert nix. Selbstredend gibt mir das Ding auch keine Fehlermeldung zurück :? So langsam streßt mich das Teil, immerhin hat das 0 Funktionalität und ist nur der leider nötige Startschuß für das wichtige Tool ^^ Hilfe :roll:

PS: Dank dieser Rumprobierei habe ich mir wenigstens mal die Win32API von Sourceforge angeschaut: sehr empfehlenswert! Wenn man mit denen auskommt und die Standard-Delphi-units vermeiden kann, dann spart das einige 100k in den exe-Dateien ...
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 17.04.05 10:58 
user profile iconprote hat folgendes geschrieben:
Selbstredend gibt mir das Ding auch keine Fehlermeldung zurück :?

Tut es schon, nur du siehst sie nicht. Warum arbeitetst du nicht mit einer Prozessliste?
prote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 17



BeitragVerfasst: So 17.04.05 16:35 
Ich habe den Dienst jetzt mal unter der Kennung admin laufen lassen und er soll mir das Tool unter meiner Kennung starten, Ergebnis ist die (jetzt sichtbare) Fehlermeldung Die Anwendung konnte nicht richtig initialisiert werden (0x0000142). Klicken Sie auf "OK", um die Anwendung zu beenden. Was soll mir das sagen? :roll:

Zur Prozessliste: was würde die mir bringen? Ich könnte doch damit lediglich abfragen, ob der Prozess läuft, starten müßte ich ihn trotzdem irgendwie - also z.B. so, wie ich es momentan erfolglos versuche. Oder habe ich das jetzt falsch verstanden? Eine Alternative wäre evtl. noch, den Taskplaner mit ins Spiel zu bringen - nur müßte das doch (theoretisch) auch ohne ihn gehen :? Hinzu kommt, daß ich erstmal gucken muß, ob der Taskplaner überhaupt auf dem System lauffähig ist, ist wie gesagt ein extrem abgesichtertes Teil und der Hersteller gibt keinerlei Support für (nötige) Änderungen im System ...
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 17.04.05 16:43 
Also noch mal zum mitdenken: Du willst einem Dienst ein bestimmtes Programm starten, wenn es nicht schon läuft. Möglichkeit ein zu überprüfen, ob es schon läuft, das Fenster suchen. geht aber nicht, da der Dienst in einer anderen WinStat läuft. Möglichkeit zwei alle Prozesse aufliste und gucken, ob die Exe Datei dort auftaucht. Taucht sie dort nicht auf, Programm starten. Und wenn du das Programm unter einem anderen Benutzer Account starten willst, dann benutze Suche im MSDN CREATEPROCESSWITHLOGONW
prote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 17



BeitragVerfasst: So 17.04.05 16:57 
CreateProcessWithLogonW nutze ich, nur leider erfolglos ;) Die Abfrage, ob das Tool läuft ist noch nicht sauber, ok - aber somit sollte es wenigstens ständig neu gestartet werden und nicht so wie jetzt dank einer Fehlermeldung gar nicht. Mehrfach kann das Tool ohnehin nicht gestartet werden, da ist der Schutz gegen doppelt Starten drin ... Der Dienst läuft jetzt wie gesagt nicht mehr unter der Kennung System sondern unter einer normalen Userkennung, läuft er damit immer noch in einer anderen WinStat, als die normalen Fensterchen? Gibt es eine Möglichkeit das Ding von der "Falschen" aus in der "Richtigen" zu starten? :roll:

Edit: Ich hab mal noch die Struktur von StartUpInfoW kopiert, ich denke, daß ich bei der Belegung der Parameter meienn Fehler drin habe - muß aber zugeben, daß ich keinen Plan habe, was ich da wie genau belegen müßte :? Vor allem der Pointer auf lpDesktop_PAL_Undefined (bzw. lpDesktop) erscheint mir in dem Zusammenhang recht interessant

Das Original von MS:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
01470 typedef struct _STARTUPINFOW {
01471     DWORD cb;
01472     LPWSTR lpReserved_PAL_Undefined;
01473     LPWSTR lpDesktop_PAL_Undefined;
01474     LPWSTR lpTitle_PAL_Undefined;
01475     DWORD dwX_PAL_Undefined;
01476     DWORD dwY_PAL_Undefined;
01477     DWORD dwXSize_PAL_Undefined;
01478     DWORD dwYSize_PAL_Undefined;
01479     DWORD dwXCountChars_PAL_Undefined;
01480     DWORD dwYCountChars_PAL_Undefined;
01481     DWORD dwFillAttribute_PAL_Undefined;
01482     DWORD dwFlags;
01483     WORD wShowWindow_PAL_Undefined;
01484     WORD cbReserved2_PAL_Undefined;
01485     LPBYTE lpReserved2_PAL_Undefined;
01486     HANDLE hStdInput;
01487     HANDLE hStdOutput;
01488     HANDLE hStdError;
01489 } STARTUPINFOW, *LPSTARTUPINFOW;


Die Umsetzung in der SourceForge-WIn32API:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
LPSTARTUPINFOW = ^STARTUPINFOW;
  {$EXTERNALSYM LPSTARTUPINFOW}
  _STARTUPINFOW = record
    cb: DWORD;
    lpReserved: LPWSTR;
    lpDesktop: LPWSTR;
    lpTitle: LPWSTR;
    dwX: DWORD;
    dwY: DWORD;
    dwXSize: DWORD;
    dwYSize: DWORD;
    dwXCountChars: DWORD;
    dwYCountChars: DWORD;
    dwFillAttribute: DWORD;
    dwFlags: DWORD;
    wShowWindow: WORD;
    cbReserved2: WORD;
    lpReserved2: LPBYTE;
    hStdInput: HANDLE;
    hStdOutput: HANDLE;
    hStdError: HANDLE;
  end;
  {$EXTERNALSYM _STARTUPINFOW}
  STARTUPINFOW = _STARTUPINFOW;
  {$EXTERNALSYM STARTUPINFOW}
  TStartupInfoW = STARTUPINFOW;
  PStartupInfoW = LPSTARTUPINFOW;