[Denkfehler gelöst]Datei beschreiben aus Service heraus
-
lippoliv schrieb:
Kann denn ein Service überhaupt in eine Datei schreiben?
Nun, ich selber habe noch nie ein Service programmiert, da bisher kein Bedarf.
Aber ich denke, daß ein Service sehr wohl in eine Datei schreiben kann.
Jedenfalls, wenn es auch die hierzu erforderlichen Rechte hat (Stichwort Admin?). Denn ein Service kann nämich aktiv sein, ohne daß sich überhaupt ein User eingeloggt hat.Unabhängig davon: Hat Dein Service überhaupt eine Datei anlegen können (also ohne Inhalt)?
Martin
-
Die datei besteht... Aber er schreibt nicht rein...
-
Da muß ich genauer wissen: Hat Dein Service diese Datei selbst anlegen können?
Oder existierte die Datei schon, z.B. hast Du mit einem Texteditor angelegt?Martin
-
Werd die Datei gleich mal Löschen und dan Postten (edit) obs geht
Momentan ist die Datei über den Editor angelegt
[edit]Datei wird nicht erstellt
-
Ok, also negativ.
Ich gehe mal davon aus, daß das Verzeichnis in das Dein Dienst versucht zu schreiben, natürlich zum Verändern freigegeben ist. Paradebeispiel: Ein Schreiben ins Programmverzeichnis schlägt oftmals fehl.Nun, dann müßtest Du erstmal zurückrudern und Dich erstmal vergewissern, ob Dein Service überhaupt erfolgreich gestartet wurde.
lippoliv schrieb:
Hi all,
ich möchte gern wissen ob mein Service "lebt".Kennst Du den Process Explorer von Sysinternals (jetzt Microsoft)?
Damit kannst Du alle Prozesse und Services usw. anzeigen lassen: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspxFür alles weitere muß ich hier vermutlich wohl passen, da ich wie gesagt noch nie einen Dienst programmiert habe.
Martin
P.S.: Funktioniert in einem Dienst auch der Breakpoint Deines Debuggers?
-
Welcher Debugger?
Währ schön wenn ich einen hätte...Also in der Computerverwaltung steht, dass der Prozess laufen würde...
[eidt]dieser Process-Watcher oder wie der heißt (heut voll durchn Wind) sagt das mein Prozess 2 schreibversuche gemacht hat... Allerdings ist keine Datei entstanden...
-
Ist es eigentlich möglich das ein Dienst in eine Datei schreibt? Ich habe gerade einen Minimalservice geschrieben:
#define _WIN32_WINNT 0x0500 #include <windows.h> #include <mapi.h> #include <tchar.h> #include <stdio.h> #include <conio.h> #include <ddk/ntdddisk.h> #include <time.h> #include "resource.h" #define svcName "WfS" #define svcDesc "WriteFileService - Just for trying" #define VERSION "0.01.01" SERVICE_STATUS mySvcState; SERVICE_STATUS_HANDLE handleMySvcState; char title[64]; void sendMailFunc( void ); BOOL allowUserForHardwareIO(); BOOL erlaubeZugriffAufHardwareIO( PTCHAR privilege ); void WINAPI svcCtrlHandler( DWORD svcCode ) { switch( svcCode ) { case SERVICE_CONTROL_PAUSE: mySvcState.dwCurrentState = SERVICE_RUNNING; break; case SERVICE_CONTROL_CONTINUE: mySvcState.dwCurrentState = SERVICE_RUNNING; break; case SERVICE_CONTROL_STOP: mySvcState.dwWin32ExitCode = 0; mySvcState.dwCurrentState = SERVICE_STOPPED; mySvcState.dwCheckPoint = 0; mySvcState.dwWaitHint = 0; break; case SERVICE_CONTROL_INTERROGATE: break; } SetServiceStatus ( handleMySvcState, &mySvcState ); } void WINAPI svcStart( DWORD argc, LPTSTR *argv ) { mySvcState.dwServiceType = SERVICE_WIN32; mySvcState.dwCurrentState = SERVICE_START_PENDING; mySvcState.dwControlsAccepted = 0; mySvcState.dwWin32ExitCode = 0; mySvcState.dwServiceSpecificExitCode = 0; mySvcState.dwCheckPoint = 0; mySvcState.dwWaitHint = 5000; handleMySvcState = RegisterServiceCtrlHandler( svcName, svcCtrlHandler ); if( SetServiceStatus( handleMySvcState, &mySvcState ) ) { mySvcState.dwCurrentState = SERVICE_RUNNING; mySvcState.dwCheckPoint = 0; mySvcState.dwWaitHint = 0; mySvcState.dwControlsAccepted = SERVICE_ACCEPT_STOP; SetServiceStatus( handleMySvcState, &mySvcState ); writeStringToLog( "Service is\t\t", "running" ); //ServiceMain(); } else { mySvcState.dwCurrentState = SERVICE_STOPPED; mySvcState.dwWin32ExitCode = 0; mySvcState.dwServiceSpecificExitCode = 0; mySvcState.dwCheckPoint = 0; mySvcState.dwWaitHint = 0; SetServiceStatus( handleMySvcState, &mySvcState ); writeStringToLog( "Service is\t\t", "not running" ); } } void WINAPI ServiceMain( void ) { int ret; HANDLE storage; DRIVERSTATUS myDriveState; DWORD tmp, diskDate[256]; /* Der Bytearray ist im grunde eine SENDCMDOUTPARAMS nur mit 530 byte puffer, da man auf sendcmdoutparams.bBuffer keinen buffer selbst legen kann, und wenn man dort keinen Pointer hinterlegen kann, wird wahllos über den "rand" der Struktur in andere Speicherbereiche, also über Variablen etc. geschrieben was zu Datenverlust führt */ BYTE getAttributes[sizeof(SENDCMDOUTPARAMS)+530]; PBYTE attribute, pBuffer; UCHAR index; int i, driveCount, offset, length; SENDCMDINPARAMS inCommandParam; SENDCMDOUTPARAMS* outCommandParam = NULL; char drive[256], parse[128], msg[128]; BOOL isAdmin = TRUE; writeStringToLog( "WfS-Version\t\t\t", VERSION ); sprintf( title, "WfS | Version: %s", VERSION ); //if( allowUserForHardwareIO() ) //dem User zugriff auf HardwareIO erlauben //{ writeStringToLog( title, " " ); /*} //allowUserForHardwareIO else { offset = GetLastError(); strcpy( msg, "Can't get User-Rights" ); for( i = strlen(msg); i <= strlen(title); i++ ) strcat( msg, " " ); writeStringToLog( "Can't get User-Rights", "\t\tprogram terminated" ); MessageBox( NULL, msg, title, MB_ICONERROR ); }*/ } int main() /* Autor: Oliver Lippert Begin: 2008-05-02 End: ============== Description: This service should just write in a file */ { /*SERVICE_TABLE_ENTRY svcDispTable[] = { { TEXT("MySvc"), (LPSERVICE_MAIN_FUNCTION)svcStart }, { NULL, NULL } }; StartServiceCtrlDispatcher( svcDispTable );*/ SERVICE_TABLE_ENTRY ServiceTable[2]; /*Service namen bestimmen. */ ServiceTable[0].lpServiceName = svcName; /*Service prozedure bestimmen. */ ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)svcStart; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc = NULL; /*Das Control-Thread für diesen Service starten. */ StartServiceCtrlDispatcher(ServiceTable); return 0; }Installiert wird er richtig ( ist die exe nicht da kann der Service nicht gestartet werden ), aber in die bestehende Datei kann er nicht schreiben...
Von den rechten her dürfte er es, und er läuft auch als Admin.Kennt wer ein Tutorial für: Datei beschreiben mit einem Dienst?
Wo kann man sowas nachlesen?Ich meine ich glaube keiner fragt hier soviel wie ich
Was mach ich "falsch"?
-
Da gibt es keine Geheimnisse. Man macht es einfach und schreibt in Dateien wie aus jedem anderen Programm auch.
Ein Service hat die Rechte des Kontextes in denen er gestartet wurde.
Innerhalb der Services gibt es keine aufgeteilten Tokens wie unter Vista im Usermode.Wen Dein Service im LOcalSystem Account läuft benötigt er auch Rechte für System auf das entsprechende Verzeichnis. Wenn er als Admin gestartet wurde müsste er die Rechte haben. (Bitte im Dienstmanager kontrollieren).
Wenn Du keine gescheite Entwicklungsumgebung hast vergiß das Entwickeln doch einfach.
BTW: WinDBg kann man sich runterladen.
-
Danke ich werde mit WinDBg mal ansehen.
Naja ich kann schlecht zu meinem Chef gehen und sagen "komm ich entwickel nichtmehr", und da er viel zu tun hat weiß er nicht das unsere Projekte inzwischen bischen komplexer als "1+1" sind... xD
Ich werde ihn nochmal wegen eclipse ansprechen, zu Hause nutze ich das und bin begeistert!
Ich gehe anhand von CodeProject nochmals meinen gesamten "MiniService" durch und suche nach einem Fehler oder soetwas.
Ich danke dir für deine Antwort, jetzt weiß ich das ich nicht umsonst suche, sondern einen Fehler gemacht haben muss

[edit]Ich weiß nicht was ich verändert.... OMG DOCH WEI´ß ich son scheiß...
Jetzt warum ich mich aufrege, die WrtieToLog:
void writeStringToLog( char* logText, char* value ) //funktion schreibt ins logfile mit dem Muster "[tt mm TT HH:MM:SS JJJJ]logText value\n" { FILE* logFile; time_t seconds; struct tm *zeit; char now[30], show[255] = { 0 }; time( &seconds ); zeit = (struct tm*)localtime( &seconds ); strcpy( now, (char*)asctime(zeit) ); now[strlen(now)] = 0; now[strlen(now)-1] = 0; if( CMDECHO ) { ZeroMemory( show, sizeof(show) ); sprintf( show, "[%s]%s%s\n", now, logText, value ); MessageBox( NULL, show, LOGFILE, MB_OK );//<<hier wartet der dienst auf ein "OK" oder "CANCLE" } logFile = fopen( LOGFILE, "r+" ); if( NULL == logFile ) logFile = fopen( LOGFILE, "a" ); else fseek( logFile, 0, SEEK_END ); if( NULL != logFile ) { fprintf( logFile, "[%s]%s%s\n", now, logText, value ); fclose( logFile ); } }Solange ich da nichts mache schreibt er ja auch nicht... umpf... Sry das ich eure Zeit verschwendet habe...
xD die kleinen denkfehler sind die übelsten.!
-
lippoliv schrieb:
logFile = fopen( LOGFILE, "r+" );
ich würde mal das Logfile zum Schreiben und nicht zum Lesen öffnen, dann klappts auch 'mim Scheff.
-
r+ := "Öffnen der Datei zum Lesen und Schreiben"
Es ist essentiell(oder wie auch immer man das schreibt) wichtig, das der Dateiinhalt nicht verloren geht(was bei "w" o. "w+" der fall währe);