Windows Dienst
-
Hey Leute!
Bin grad dabei meine Matura (bzw. Abitur) zu machen!
Arbeite an einem Projekt, welches Hard- und Software eines PC's ausliest und diese an einem Server übermittelt.
Dadurch, dass ich mit der Registry arbeite, habe ich das Problem, falls ich als Benutzer angemeldet bin, dass ich keine Rechte hab aus der Regestry zu lesen.
Jetzt versuch ich mein Client - Programm als Dienst zu starten, dem ich lokale Admin Rechte übergeben will.
Mein Programm erstellt zwar den Dienst, startet ihn aber nicht!
Probier ihn folgend zu starten:
if(StartService(next,0,NULL)!=NULL)
next ist der gespeichterte Handle von CreateService.
Bitte um Hilfe!!
-
Um Dienste zu starten muß man Admin-Rechte haben. Und die hat dein Progremm eventuell nicht, also erst holen.
-
Naja! Die Admin Rechte will ich ja dem Dienst übergeben!!
Hab nur das Problem, dass mein Dienst nicht starten will!
-
Ein Dienst läuft sowieso auf dem Systemkonto. Aber um ihn zu starten mußt du Admin-Rechte haben. Und wenn die dein programm nicht hat, kann es auch den Dienst nicht starten!
-
Schön und gut! Glaub ich dir aber nicht!
Denn ich kann einem Dienst lokale Admin Rechte zuteilen!
Aber darum gehts auch nicht!!
Denn auch wenn ich als Administrator eingeloggt bin, funkt das nicht!
Ich will einfach nur mal den Dienst starten!
Nur ich bekomm jedes Mal die Fehlermeldung, dass der Dienst nicht gestartet werden kann! Und das liegt auf keine Fall an den Rechten!
Wenn du mir irgendwie weiter helfen könntest, woran das liegt, dass ich den Dienst nicht starten kann, wär ich dir sehr dankbar!
-
Poste doch mal bitte ein wenig mehr Code...
-
[...], falls ich als Benutzer angemeldet bin, dass ich keine Rechte hab aus der Regestry zu lesen.
Ich hab zwar kein Windows NT,2k oder XP, aber ich kann mir nicht vorstellen, dass Windows den Programmen verbietet aus der Registry zu lesen. Oder sind die bereiche die du willst wirklich nicht lesbar für normale User?
Es ist nämlich ein häufiger Flüchtigkeitsfehler beim öffnen der Registryschlüssel einfach mal ALL_ACCESS oder so anzugeben. Dass das nicht funktioniert, liegt auf der Hand.
-
Ähmmm....
das ganze hat jetzt nix mit der Regestry zu tun!
Ich will einfach nur einen Dienst starten.
der code:
SC_HANDLE hand, next;if((hand=OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ALL_ACCESS))==NULL)
cout << "Fehler beim oeffnen des Managers\n";
else
{
if ((next=OpenService(hand,"Schau",SC_MANAGER_ALL_ACCESS))==NULL)
{
cout << "Fehler beim oeffnen des Service\n";
if ((next=CreateService(hand,"Schau","Puddel",SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,"\"c:\\oop_client.exe\"",NULL,NULL,NULL,NULL,NULL) )==NULL)
cout << "Fehler beim erstellen des Services\n";
else
cout << "Dienst erstellt\n";
}
else
cout << "Dienst geoeffnet\n";
if(StartService(next,0,NULL)!=NULL)
cout << "Dienst gestartet\n";
else
cout << "Dienst nicht gestartet: \n" << GetLastError();
}
-
Mann, du hast da schon ein GetlastError eingebaut, aber uns verraten was GetLastError liefert tust du nicht!
-
Sorry, ...
Dienst nicht gestartet: 1053
-
Bau mal GetLastError an mehreren Stellen ein. Am sinnvollsten nach Funktionsaufrufen.
-
GetLastError nützt mir ja nur was, wenn ein Fehler auftritt!
Aber alle anderen Aufrufe funktionieren ohne Probleme.
Ich überprüf sie ja alle auf ihren Rückgabewert.
-
Der Service muß innerhalb von 30 Sekunden seinen Status an den SCM melden (SetServiceStatus). Dieser Service macht das nicht, daher bekommst Du einen TimeOut als Fehler gemeldet.
-
Wollt das jetzt ausprobieren; doch ich hab Probleme mit den Parametern von RegisterServiceCtrlHandler; 2 Parameter soll ein Zeiger auf eine regestrierte Handler Funktion sein!? Weiß nicht wie ich das definier! Bzw. bei SetServiceStatus hab ich beim 2 Parameter das Problem, dass der auf die SERVICE_STATUS Struktur zeigen soll.
Vielleicht kann mir jemand ein bisschen Beispielcode zeigen??
-
Vielleicht solltest Du Dich erstmal ein wenig mit Services beschäftigen. Gorb gesagt funktioniert das jedenfalls so: Das Programm startet in der Funktion main bzw. WinMain. Dort übergibst Du dem SCM einen Zeiger auf Deine ServiceMain-Funktion (StartServiceCtrlDispatcher). In der ServiceMain-Funktion registrierst Du nun Deinen Control-Handler (RegisterServiceControlHandler/Ex). Dabei bekommst Du dann auch das benötigte Handle geliefert.
Die genaue Beschreibung und jede Menge Samples bekommst Du hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/services.asp?frame=true
-
Mal 'ne ganz andere Frage: Wo landet eigentlich die Ausgabe von cout, wenn ich keine Konsole aufmache?
-
Im Nirvana
-
Geh zu Codeguru. Dort gibt es einen Wizard zum erstellen von Services.
Warum willst du das Rad neu erfinden. Kannst dir ja den erstellten Source anschauen den der Wizard produziert.