Windows 2000 Logon Screen selber schreiben
-
Kann Novell tatsächlich den Anmeldedialog von Windows2000 verändern. Allerdings fürchte ich dass das nicht so einfach geht, wie bei WindowsXP. Und da wären wir wieder am anfang. Ich könnte mir vorstellen, dass das in einer art von Netzwerktreiber realisiert wurde. Das ist aber reine Spekulation.
-
Das Problem ist, dass ich mir auch nicht mehr sicher bin, dass es Novel war. Es war ein bekanntes Netzwerk-Tool, sofern man Novel als Netzwerk-Tool beschreiben kann, ich habe mich ehrlich gesagt nie damit auseinander gesetzt.
Kann man nicht irgendwie rausbekommen, wo genau sich der Dialog befindet und dann mit einem Resource Editor oder einem Exe Joiner den Dialog so verändern, dass einfach automatisch eine weitere Datei ausgeführt wird, ähnlich wie der Logon-Screensaver.
Diese Anwendung kann dann ja einfach Kontrolle über den Dialog übernehmen und eigenständig den Nutzernamen in das Textfeld einsetzen. Der ursprüngliuche Dialog kann dabei dann ja sogar ausserhalb des sichtbaren Bildschirmbereiches verschoben werden.
Ist nur so ne Idee, weil ich leider zu wenig Ahnung habe wie ich das realisieren kann, dass ein Programm gestartet wird.
Mfg,
Striker
-
Das Programm das du meinst heißt Netware und ist von Novell.
Aber mal n' andere Lösungsvorschlag:
Du lässt dein Programm als Dienst laufen. Dann kannst du ja versuchen das Fenster zu ermitteln, das den Login Dialog darstellt. Und mit dem Fensterhandle könnte man ja mit dem Fenster schon so einiges anstellen...
-
Hmm, das mit dem Service ist ne nette Idee. Danke.
Womit ich vor einem neuen Problem stehe: Ich hab noch nie einen Service programmiert. Wird mal was neues ;).
Ich habe inzwischen eine gute dreiviertel Stunde gesucht, habe aber leider noch keine grossartigen Infos bzw. Tutorials zum Thema Service Coden gefunden. Also wenn da einer was gutes kennt würde ich mich echt freuen.
Vorallem sollte das dann ja ein "interaktiver" Service sein, da man ja sonst keine Fenster u.ä. erstellen kann.
-
Ich hab mal vor einiger Zeit so ein bisschen mit Services experimentiert. Der Folgende Code erzeugt eine Exe Datei, die sich mit dem Argument '-install' als Service installieren läst. Der Code ist ANSI-C, du müstest also für C++ vielleicht nocht was verändern. Außerdem müsstest du noch ein paar Argumente ändern, damit die Fenster des Dienstes angezeigt werden. Aber vielleicht hilft dir das trozdem weiter. Den code habe ich durch langes lesen der Win API referenz mir erarbeitet.
//--------------------------------------------------------------------------- #include <windows.h> #include <stdio.h> #pragma hdrstop //--------------------------------------------------------------------------- SERVICE_STATUS MyServiceStatus; SERVICE_STATUS_HANDLE MyServiceStatusHandle; VOID MyServiceStart (DWORD argc, LPTSTR *argv); VOID MyServiceCtrlHandler (DWORD opcode); DWORD MyServiceInitialization (DWORD argc, LPTSTR *argv, DWORD *specificError); VOID SvcDebugOut(LPSTR String, DWORD Status) ; void MainProc( void ) { MessageBeep( 440 ); Sleep( 3000 ); MessageBeep( 440 ); } VOID _CRTAPI1 main( int argc, char* argv[] ) { STARTUPINFO si; PROCESS_INFORMATION pi; char buf[MAX_PATH]; OSVERSIONINFO VerInfo; int i; SC_HANDLE hSC; SERVICE_TABLE_ENTRY DispatchTable[] = { { TEXT("MyService"), MyServiceStart }, { NULL, NULL } }; for( i = 1; i < argc; i++ ) { if( strcmpi( argv[i], "-install" ) == 0 ) { hSC = OpenSCManager( 0, 0, SC_MANAGER_CREATE_SERVICE ); CreateService( hSC, // handle to service control manager database "TestService", // pointer to name of service to start "TestService", // pointer to display name SERVICE_CHANGE_CONFIG, // type of access to service SERVICE_WIN32_OWN_PROCESS, // type of service SERVICE_AUTO_START, // when to start service SERVICE_ERROR_NORMAL, // severity if service fails to start argv[0], // pointer to name of binary file 0, // pointer to name of load ordering group 0, // pointer to variable to get tag identifier 0, // pointer to array of dependency names 0, // pointer to account name of service 0 // pointer to password for service account ); } if( strcmpi( argv[i], "-uninstall" ) == 0 ) { hSC = OpenSCManager( 0, 0, SC_MANAGER_CREATE_SERVICE ); hSC = OpenService( hSC, "TestService", STANDARD_RIGHTS_REQUIRED ); if( DeleteService( hSC ) ) printf( "Service has been deleted" ); else printf( "Failed to delete Service" ); } } VerInfo.dwOSVersionInfoSize = sizeof( VerInfo ); GetVersionEx( &VerInfo ); /* we are on a NT machine */ if( VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT ) { printf( "Running on WinNT %d.%d.%d", VerInfo.dwMajorVersion, VerInfo.dwMinorVersion, VerInfo.dwBuildNumber ); if (!StartServiceCtrlDispatcher( DispatchTable )) { SvcDebugOut("[MY_SERVICE] StartServiceCtrlDispatcher error =" "%d\n", GetLastError()); } } /* we are on win9.x */ else { printf( "Running on Win32 %d.%d.%d", VerInfo.dwMajorVersion, VerInfo.dwMinorVersion, LOWORD(VerInfo.dwBuildNumber) ); FreeConsole(); MainProc(); } } VOID SvcDebugOut(LPSTR String, DWORD Status) { CHAR Buffer[1024]; if (strlen(String) < 1000) { sprintf(Buffer, String, Status); OutputDebugStringA(Buffer); } } void MyServiceStart(DWORD argc, LPTSTR *argv) { DWORD status; DWORD specificError; MyServiceStatus.dwServiceType = SERVICE_WIN32; MyServiceStatus.dwCurrentState = SERVICE_START_PENDING; MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwServiceSpecificExitCode = 0; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; MyServiceStatusHandle = RegisterServiceCtrlHandler( TEXT("MyService"), (LPHANDLER_FUNCTION)MyServiceCtrlHandler); if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) { SvcDebugOut("[MY_SERVICE] RegisterServiceCtrlHandler" "failed %d\n", GetLastError()); return; } // Initialization code goes here. status = MyServiceInitialization(argc,argv, &specificError); // Handle error condition if (status != NO_ERROR) { MyServiceStatus.dwCurrentState = SERVICE_STOPPED; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; MyServiceStatus.dwWin32ExitCode = status; MyServiceStatus.dwServiceSpecificExitCode = specificError; SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus); return; } // Initialization complete - report running status. MyServiceStatus.dwCurrentState = SERVICE_RUNNING; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); SvcDebugOut("[MY_SERVICE] SetServiceStatus error" "%ld\n",status); } // This is where the service does its work. SvcDebugOut(" [MY_SERVICE] Returning the Main Thread \n",0); MainProc(); return; } // Stub initialization function. DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError) { argv; argc; specificError; return(0); } VOID MyServiceCtrlHandler (DWORD Opcode) { DWORD status; switch(Opcode) { case SERVICE_CONTROL_PAUSE: // Do whatever it takes to pause here. MyServiceStatus.dwCurrentState = SERVICE_PAUSED; break; case SERVICE_CONTROL_CONTINUE: // Do whatever it takes to continue here. MyServiceStatus.dwCurrentState = SERVICE_RUNNING; break; case SERVICE_CONTROL_STOP: // Do whatever it takes to stop here. MyServiceStatus.dwWin32ExitCode = 0; MyServiceStatus.dwCurrentState = SERVICE_STOPPED; MyServiceStatus.dwCheckPoint = 0; MyServiceStatus.dwWaitHint = 0; if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); SvcDebugOut(" [MY_SERVICE] SetServiceStatus error " " %ld\n",status); } SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0); return; case SERVICE_CONTROL_INTERROGATE: // Fall through to send current status. break; default: SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n", Opcode); } // Send current status. if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus)) { status = GetLastError(); SvcDebugOut(" [MY_SERVICE] SetServiceStatus error" "%ld\n",status); } return; }
-
zur Info: Ja, NOVELL hat einen eigene Anmeldebildschirm, auch bei Win2000!

Gruss,
code_pilot
-
Boah, ein riesiges Dankeschön für den Code!
Ein Fehler ist da noch drinn:
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ TEXT("MyService"), MyServiceStart },
{ NULL, NULL }
};Da bekomme ich vom Compiler:
Compiling...
main.cpp
e:\c\servetest2\main.cpp(35) : error C2440: 'initializing' : cannot convert from '' to 'void (__stdcall *)(unsigned long,char ** )'
None of the functions with this name in scope match the target typeIch habe einfach im Visual Studio ein Neues Projekt erstellt und Compiliert

-
code_pilot schrieb:
zur Info: Ja, NOVELL hat einen eigene Anmeldebildschirm, auch bei Win2000!

Gruss,
code_pilotIch hab auch schon ein Fenster gesehen *vor* dem Anmeldeschirm bei dem man eine "Ich bin damit einverstanden..."-Klausel mit "Okay" bestätigen musste bevor man zum Anmeldebildschirm kam. Also ist es definitiv schon möglich.
MfG SideWinder
-
Hatten wir das nicht schon einmal in letzter Zeit? Mir fällt dazu nur Winlogon&Gina ein...
-
Wie ich schon erwähnt habe, ist diese Code in ANSI C geschrieben. Aber eine kleine änderung lässt ihn auch unter C++ compilieren.
SC_HANDLE hSC; SERVICE_TABLE_ENTRY DispatchTable[] = { { TEXT("MyService"), (LPSERVICE_MAIN_FUNCTION)MyServiceStart }, { NULL, NULL } };Noch ein kleiner Hinweis:
Du MUSST eine Consolenanwendung erstellen!!!
-
Vielleicht kann man das ganze über gina.dll(s) machen. Sind als Erweiterungen für die Anmeldung (und den Dialog auch soviel ich weiß gedacht). Hab davon schon einmal in einem anderen Bereich gelesen - kann dazu misbraucht werden, Passwörter bei der Anmeldung zu protokollieren.