Programm->adminrechte->CreateProcess->ohne adminrechte!



  • Bist du Lehrer?
    Super Beitrag hat viel erklärt.

    Also ich habe mich jetzt rangesetzt und... naja eher probiert als gewusst;)

    yogle schrieb:

    Du musst einen String via malloc/new allokieren und der Funktion übergeben, damit sie ihn verändern kann.

    Ich habe folgendes versucht:

    main
    //...
    	WCHAR				*myCmdLine;
    	myCmdLine = malloc( 512 );//wieso will er nur einen Parameter?
    
    	strcpy( myCmdLine, "SyD_Watch.exe" );
    	retValue = 	CreateProcessWithLogonW(
    					L"ADMIN",					//benutzer
    					L".",						//domaine
    					L"ADMIN",					//pw
    					LOGON_WITH_PROFILE,					//flags
    					NULL,								//program name
    					myCmdLine,					//like system( "command" )
    					0,									//creation flags
    					NULL,							
    					NULL,								//userProfilname
    					&myStartInfoW,						//startinformation
    					&myProcessInfo						//prozessinformation
    				);
    

    das ging nicht... Strcpy will einen anderen Pointer...

    main
    //...
    	char				*myCmdLine;
    	myCmdLine = malloc( 512 );//wieso will er nur einen Parameter?
    
    	strcpy( myCmdLine, "SyD_Watch.exe" );
    	retValue = 	CreateProcessWithLogonW(
    					L"ADMIN",					//benutzer
    					L".",						//domaine
    					L"ADMIN",					//pw
    					LOGON_WITH_PROFILE,					//flags
    					NULL,								//program name
    					myCmdLine,					//like system( "command" )[ergiebt fehler: passing arg 6 of `CreateProcessWithLogonW' from incompatible pointer type]
    					0,									//creation flags
    					NULL,							
    					NULL,								//userProfilname
    					&myStartInfoW,						//startinformation
    					&myProcessInfo						//prozessinformation
    				);
    

    ^^dieser fehler ist Logisch weils ein Charpointer ist, auf den WCHAR kann aich aber nicht allocieren... oder mach ich da was falsch?

    Danke schonmal



  • Danke, aber nein ich bin kein Lehrer.
    Das was du versuchst ich fast richtig. strcpy ist zuerst einmal die Ansi-Variante, wcscpy wäre die Wide-Variante und _tcscpy die universale Methode, diese funktioniert aber nur für den Microsoft Visual C++ Compiler. Allerdings sollte man eher wcsncpy verwenden, um (mögliche) Buffer-Overflows zu vermeiden. malloc möchte als Parameter nur die Größe des zu allkoierenden Speicherbereiches und gibt dir einen void Pointer zurück. Den kann/darf man auf alle Typen casten!

    // WCHAR ist nur ein typedef von wchar_t 
    wchar_t *myCmdLine = NULL;    // Man sollte Variablen immer initialisieren
    
    myCmdLine = (wchar_t*) malloc (512 * sizeof (wchar_t));
    
    wcsncpy (myCmdLine, L"SyD_Watch.exe", 512);
    

    So sollte es gehen. Du musst beachten, dass wenn du Wide-Strings verwendest, die Größe deines Speichers in Bytes nicht mehr der Größe/Länge deines Strings entspricht (im Gegensatz zur Ansi-Strings). Ein Wide-Zeichen benötigt nämlich 2 Bytes!



  • Danke dir, jetzt bekomme ich ein error 1305 "The revision level is unknown."...

    Ich mach jetz feierabend, aber wer n Link hat wo sowas schonmal behandelt worden ist, oder wer eine Antwort weiß und lust hat diese zu Posten, feel free 🙂

    Ich werde aber auf j eden fall noch mal selber suchen.



  • Wechsel mal Compiler 👍



  • Hehe... ich muss euch was gestehen.
    Der Fehler 1305 liegt nicht bei CreateProcessWithLogonW sondern bei dem darauffolgenden CreateProcess

    //code
    	STARTUPINFO 		myStartInfo;
    	SECURITY_ATTRIBUTES mySec;
    		//irgendwas
    		ZeroMemory( &myProcessInfo, sizeof(PROCESS_INFORMATION) );
    		ZeroMemory( &myStartInfo, sizeof(STARTUPINFO) );
    		myStartInfo.cb = sizeof(STARTUPINFO);
    
    		retValue = 	CreateProcess(
    						NULL,			//program name
    						"SyD_Mail.exe oliver@sonstwas.de",		//like system( "command" )
    						&mySec,			//process security attributes
    						NULL,			//primary thread security attributes
    						FALSE,			//inherited handles
    						0,				//creation flags
    						NULL,			//use parents enviroments
    						NULL,			//use parents current direction
    						&myStartInfo,
    						&myProcessInfo
    					);
    //code
    

    [edit]Wieso denn das? Ich habe das schon das ein-oder-andere mal angewandt...

    [edit2]funktioniert, musste das Security_Attribute nicht mitübergeben... 🙂



  • Der zweite Parameter muss beschreibbar sein und darf kein String-Literal sein...
    Auch musst Du bei "SECURITY_ATTRIBUTES" die "nLength" korrekt setzen und der Rest auf NULL (bzw. es ganz weglassen!)!



  • Siehe edit2... Danke trotzdem...

    Kann mir wer sagen warum mein Programm (trotz erfolg von CreateWithLogon...) keine Adminrechte hat?

    int main( void )
    {
    	PROCESS_INFORMATION	myProcessInfo;
    	STARTUPINFOW		myStartInfoW;
    	STARTUPINFO 		myStartInfo;
    	BOOL				retValue;
    	wchar_t				*myCmdLine = NULL;
    	char buff[5];
    
    	myCmdLine = (wchar_t*)malloc( 512 * sizeof(wchar_t) );
    
    	wcsncpy( myCmdLine, L"SyD_Watch.exe", 512 );
    
    	ZeroMemory( &myProcessInfo, sizeof(PROCESS_INFORMATION) );
    	ZeroMemory( &myStartInfoW, sizeof(STARTUPINFOW) );
    
    	retValue = 	CreateProcessWithLogonW(
    					L"ADMIN",					//benutzer
    					L".",						//domaine
    					L"ADMIN",					//pw
    					LOGON_WITH_PROFILE,			//flags
    					NULL,						//program name
    					myCmdLine,					//like system( "command" )
    					0,							//creation flags
    					NULL,							
    					NULL,						//userProfilname
    					&myStartInfoW,				//startinformation
    					&myProcessInfo				//prozessinformation
    				);
    }
    


  • Ich muss meine aussage revidieren(schreibt sich das so?)

    Ich sehe im Taskmanager das SyD_Watch von ADMIN ausgeführt wird, aber ich habe trotzdem keine Adminrechte... Wie kommt das?



  • Vista?



  • Ja.... Verdammt nicht schon wieder...

    WIESO IST VISTA SO GEIL UND TROTZDEM SONE KATASTROPHE?

    Mir platzt gleich der Kopf... Das ist ein endloses gefrikel mit admin nich admin usw...

    Liegt das echt an Vista?



  • Wenn Du in Vista ein Admin bist, hast Du keine Adminrechte 😉 Du musst den Prozess "elevated" starten 😉

    Frag mich jetzt aber bitte nicht wie das geht.. muss ich auch zuerst rausfinden....

    Eine Erklärung wie das Windows selber macht ist hier:
    http://msdn2.microsoft.com/en-us/library/bb756945.aspx

    Wenn Du den Prozess mit "RunAs" als Command startest, wird auch automatisch der "UAC-Dialog" gezeigt und Du bist richtiger Admin.

    Natürlich kann Deine EXE auch ein "requireAdministartor" im Manifest haben, dann wird es sofort unter dem Admin-Account ausgeführt, ohne dass Du was spezielles machen musst (aber nur mit ShellExecute!)!



  • Es sieht nach einem Lösungsweg aus!?

    Kannst du etwas genauer werden bitte?

    Es ist also möglich über ShellExecute einen Prozess wirklich mit Adminrechten zu Starten OHNE das der User eine eingabe machen muss?
    Passwort und Benutzername können erstmal Statisch im Quellcode sein ist mir egal, aber es ist echt möglich ja?


  • Mod

    lippoliv schrieb:

    Es ist also möglich über ShellExecute einen Prozess wirklich mit Adminrechten zu Starten OHNE das der User eine eingabe machen muss?
    Passwort und Benutzername können erstmal Statisch im Quellcode sein ist mir egal, aber es ist echt möglich ja?

    Es erfolgt kein Prompt, wenn der startende Prozess bereits elevated läuft.
    Läuft der Prozess der den neuen Prozess als Admin starten will nicht elevated erfolgt immer der UAC Prompt. Und das ist gut so! 🕶



  • Gut sschon, ist sicher aber pass auf:
    Ich habe einen Computer auf dem gibt es einen "Admin" acc. mit dem pw "admin"(Musterdaten).
    Jetzt soll ich ein Programm schreiben das unter dem Useracc läuft was SMART ausliest.
    Ich habe mich damit abgefunden erstmal eine Version zu erstellen bei der man das Prog als Admin startet. Der User soll davon nichts mitbekommen, er kennt das Adminpw nicht.

    Also will ich (erstaml) fest in einen Quellcode Daten tippen, anhand derer ein Programm als Admin*(mit dessen rechten)* laufen soll.

    Frage: Ist das möglich?

    Sogut Vista auch ist, ich glaube nciht das dies machbar ist 😉 😃

    Danke schonmal für die Antworten


  • Mod

    Mach es richtig:
    - Schreib einen Service, der die Daten liest
    - Schreib ein Programm, dass die daten aus dem Service abholt und darstellt.



  • Service könnten auf SMART zugreifen? Die haben ja keine Adminrechte...
    [edit]aber ich kann dorteinstellen das sie als Admin ausgeführt werden wa?

    Ich muss diese Daten auch nicht Darstellen(ist positiv) sondern nur in ein Logfile schreiben... 🙂
    Den Datenaustausch kann ich über son SahredMem machen ne?
    [edit]also das müsste ja auch vom Dienst gehen ne?



  • Um ein Programm mit erhöhten Benutzerrechten zu starten muss man das Manifest anpassen. Dann fordert er übrigens auch bei CreateProcess und ähnlichen die richtigen Rechte an..
    Ist unter Vista ganz nett wenn mans raus hat. Es funktioniert nur leider unter XP nicht in der Art und das ist ziemlich lästig.



  • Naja aber bei vista würde dann doch auch dieses läste "Logg dich ein und komm rein" ding erscheinen oder?


  • Mod

    lippoliv schrieb:

    Naja aber bei vista würde dann doch auch dieses läste "Logg dich ein und komm rein" ding erscheinen oder?

    Korrekt! Immer!



  • WHA *nahezuHeul* 😃

    Genau das darf nicht passieren, desswegen lohnt es sich einen Dienst zu schreiben der das macht ja? Weil der ja dann im Admin laufen kann ja?


Anmelden zum Antworten