Programm->adminrechte->CreateProcess->ohne adminrechte!
-
Hey all,
da die Überschrifft wahrscheinlich nicht darauf schließen lässt, was ich so machen will erleutere ich es mal genauer:Ich habe ein Programm mit HardwareIO also muss es als ADMIN laufen und dann soll bei bestimmten Bedingungen eine Email senden.
Da der Adminbenutzer dem Exchange-Server nicht bekannt ist, geht das allerdings nicht. Also muss die Mailfunktion als normaler Benutzer ausgeührt werden, hierzu habe ich eine eigene EXE compiliert, die mir das Muster sendet, was ich fest vorgegeben habe.
Ich habe mir gedacht über 'system( "mail.exe" );' kann ich das werkstelligen, allerdings hat es dann auch Adminrechte da es über die Kommandozeile gestartet wird, die ja schon Adminrechte hat.
Wie kann ich nun -über CreateProcess wahrsccheinlcih- Benutzerrechtlich ein Programm Starten?
BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, __inout_opt LPTSTR lpCommandLine, __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, //> typedef struct _SECURITY_ATTRIBUTES { //> DWORD nLength; //> LPVOID lpSecurityDescriptor; //<<<<<? //> BOOL bInheritHandle; //> } SECURITY_ATTRIBUTES, //> *PSECURITY_ATTRIBUTES, //> *LPSECURITY_ATTRIBUTES; __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCTSTR lpCurrentDirectory, __in LPSTARTUPINFO lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInformation );
Wenn das mein Ziel ist, wie gehe ich damit um?
-
erstens bist du wiedermal im falschen Forum (das ist doch ganz klar WinApi, das weist du doch selber!)
zweitens solltest du nicht system nutzen sondern ShellExecute oder CreateProzess!
drittens, wieso hat dein Console Adminrechte? Wenn das so ist solltest du nicht die Adminrechte über dein Programm wegnehmen sondern garnicht als Admin arbeiten wenn du als normaler User arbeiten willst.
viertens nutzt du WinXP oder Vista? Weil unter Vista wird es ein wenig schwieriger.
und zu allerletzt fünftens, nutzt die Suche! Es gibt zigg Beiträge hier im Forum oder mittels google.schirrmie
-
schirrmie schrieb:
erstens bist du wiedermal im falschen Forum (das ist doch ganz klar WinApi, das weist du doch selber!)
Ich habe überlegt wohin dieser Post denn gehört, weil ichs ja oft falsch mach, und für mich is WinAPI immer irgendwas mit Oberfläche aber da lieg ich wohl falsch sry.
schirrmie schrieb:
zweitens solltest du nicht system nutzen sondern ShellExecute oder CreateProzess!
Tu ich nicht, habe ich geschrieben
lippoliv schrieb:
Wie kann ich nun -über CreateProcess wahrsccheinlcih- Benutzerrechtlich ein Programm Starten?
und folgend sogar noch CreateProcess - params
schirrmie schrieb:
drittens, wieso hat dein Console Adminrechte? Wenn das so ist solltest du nicht die Adminrechte über dein Programm wegnehmen sondern garnicht als Admin arbeiten wenn du als normaler User arbeiten willst.
Datei.exe->rechtsklick->Als admin ausführen == Konsole mit adminrechten (habe mich wohl nicht gut ausgedrückt sry)
schirrmie schrieb:
viertens nutzt du WinXP oder Vista? Weil unter Vista wird es ein wenig schwieriger.
Vista... Da ist einiges schwieriger
, sonst würde mein Programm ja auch mit Benutzerrechten laufen
schirrmie schrieb:
und zu allerletzt fünftens, nutzt die Suche! Es gibt zigg Beiträge hier im Forum oder mittels google.
"createprocess mit benutzerrechten" oder ähnliches bringt nichts bei google, ich bin ein such-looser ich such immer falsch, denke wohl zu spezifisch,
die Forumssuche -muss ich wohl gestehen- habe ich versgesesnWas meinst du mit schwieriger? Ich habe gelesen das ich mit diesen SECURITY_DESCRIPTORen arbeiten könnte, allerdings sollte man die nicht veränder, da die Variieren können.
Welche gibt es?Thx*~(gibtes ne funktion wo leute wie ich ihre Posts selber verscheiebn können?)~*
-
lippoliv schrieb:
schirrmie schrieb:
drittens, wieso hat dein Console Adminrechte? Wenn das so ist solltest du nicht die Adminrechte über dein Programm wegnehmen sondern garnicht als Admin arbeiten wenn du als normaler User arbeiten willst.
Datei.exe->rechtsklick->Als admin ausführen == Konsole mit adminrechten (habe mich wohl nicht gut ausgedrückt sry)
Und warum tut man sowas wenn man es mit User rechten ausführen will. Tut mir leid ich versteh das absolut nicht. Du lässt es -extra- als admin laufen aber dann willst du es nicht mehr als admin laufen lassen
Achso und das WinApi-Forum ist nicht auf "Fenster" begrenzt, sondern wenn man Fragen über die WinApi hat also über die Funktionen/Strukturen/Datentypen/sonstiges der WinApi und CreateProzess ist jawohl eindeutig eine Funktion der WinApi
schirrmie
-
Ja ich verpeil dass nur immer, bin zu doof zu
Also was es mit dieser Admin-nich_Admin Geschichte auf sich hat, ist ganz einfach.
Ich benutze DeviceIoControl dazu brauche ich Adminrechte, je nach Ergebniss der "Messung" schreibe ich eine Email oder lass es.
Zum Email schreiben darf ich unter keinen umständen Admin sein, sondern muss ein in der Domäne vorhandener User sein, sonst erkennt der MS Exchange Server nicht, wer ich bin und ich darf keine Email senden / mich nicht mal einloggen (MAPILogon).Und da ich schlecht sagen kann "führ diese Funktion als Benutzer aus, aber diese als Admin" bin ich der Typ mit der A-Karte, oder ich schaffe es,
dass DeviceIoControl auch alss benutzer auszuführen ist. Dann kann ich mir das Admingedöns sparen.
-
Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
CreateProcessAsUser
-
Systemfehler 1314
Ich habe gelesen dieser Fehler verschwindet, wenn man einfach CreateProcessWithLogonW benutzt, allerdings:
#define _WIN32_WINNT 0x0500 #include <windows.h> #include <tchar.h> #include <userenv.h> int main( void ) { PROCESS_INFORMATION myProcessInfo; STARTUPINFO myStartInfo; BOOL retValue; SECURITY_ATTRIBUTES mySec; HANDLE testToken; LPVOID enviroment; WCHAR profileName[256] = L""; DWORD buffSize; ZeroMemory( &myProcessInfo, sizeof(PROCESS_INFORMATION) ); ZeroMemory( &myStartInfo, sizeof(STARTUPINFO) ); LogonUser( "ladmin", //benutzer ".", //domaine "ladmin", //pw LOGON32_LOGON_INTERACTIVE, //interaktives einloggen LOGON32_PROVIDER_DEFAULT, //logon-provider &testToken //Handle für userrechten ); if( 0 != testToken ) { CreateEnvironmentBlock( &enviroment, testToken, TRUE ); buffSize = sizeof(profileName)/sizeof(WCHAR); GetUserProfileDirectory( testToken, profileName, &buffSize ); retValue = CreateProcessWithLogonW( (LPCWSTR)"ADMIN", //benutzer (LPCWSTR)".", //domaine (LPCWSTR)"AMDIN", //pw LOGON_WITH_PROFILE, //flags NULL, //program name (LPCWSTR)"SyD_Watch.exe", //like system( "command" ) CREATE_UNICODE_ENVIRONMENT, //creation flags enviroment, profileName, //userProfilname &myStartInfo, //startinformation &myProcessInfo //prozessinformation ); if( retValue ) //wenn es geklappt hat { //code } else printf( "CreateProcessAsUser: %d", GetLastError() ); } else printf( "LogonUser: %d", GetLastError() ); printf( "\n" ); system( "pause" ); return 0; }
Da bekomm ich nette sachen...
SyD_Prog.c: In function `main': SyD_Prog.c:42: warning: passing arg 2 of `GetUserProfileDirectoryA' from incompatible pointer type SyD_Prog.c:56: warning: passing arg 6 of `CreateProcessWithLogonW' discards qualifiers from pointer target type SyD_Prog.c:56: warning: passing arg 10 of `CreateProcessWithLogonW' from incompatible pointer type C:\Users\oliver\AppData\Local\Temp/ccKocaaa.o:SyD_Prog.c:(.text+0xa4): undefined reference to `CreateEnvironmentBlock@12'C:\Users\oliver\AppData\Local\Temp/ccKocaaa.o: SyD_Prog.c:(.text+0xc1): undefined reference to `GetUserProfileDirectoryA@12' collect2: ld returned 1 exit status
Erstmal verstehe ich gar nicht wieso er sagt das ich in GetUserProfileDirectoryA einen incompitablen Pointer habe, aber später sagt "Undefines reference to GetUserProfileDirectory"... Wenn er das nicht kennt, wieso weiß er das ich einen incompitablen pointer habe?
Und dann das CreateProcessWithLogonW... Ich würds ungern benutzen, weil ich davor noch 2 mir unbekannte Funktionen einbauen muss,
aber bei CreateProcessAsUser muss ich ja wieder im System was einstellen oder?MFG
-
Nur mal so am Rande: Ich habe gesucht nach "vista CreateProcess without admin"
und bin sofort auf den langen Thread:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=422705&SiteID=1Überfliegt man diesen Thread stösst man schnell auf
CreateRestrictedToken und CreateProcessAsUser!
http://msdn2.microsoft.com/en-us/library/aa446583(VS.85).aspx
-
CreateProcessAsUser währe auch ur die gute lösung, aber da muss man ja wieder in der Systemsteuerung was einstellen.
Muss man das immer oder gibt es da einen "umweg" mit anderen Funktionen?Ich mein wie CreateProcessAsUser Funktioniert habe ich ja schon so einiger maßen mitbekommen, jetzt hat er ja nur 1314 was besagt "A required privilege is not held by the client."...
Werd mir die anderen Sachen nochmal durchlesen, aber wenn jemand mir jetzt shcon sagen kann, dass ich IMMER in der Systemsteuerung einsellen muss, bleibe ich bei CreateProcessAsUser
Danke
-
Verstehe ich nicht? Was musst Du für CreateProcessAsUser in der Systemsteuerung umstellen?
-
Naja ich habe irgendwo gelesen, dass ich dafür etwas erlauben muss wenn fehler 1314 (A required privilege is not held by the client.)kommt...
Ich muss das nochmal raussuchen, stand hier im Forum sogar...
[edit]ich merke gerade: http://www.c-plusplus.net/forum/viewtopic-var-t-is-106037-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-createprocessasuser-and-start-is-10.html hier hat er 11 Parameter für Logon...
retValue = CreateProcessWithLogonW( (LPCWSTR)"ADMIN", //benutzer (LPCWSTR)".", //domaine (LPCWSTR)"ADMIN", //pw LOGON_WITH_PROFILE, //flags NULL, //program name (LPCWSTR)"SyD_Watch.exe", //like system( "command" ) NULL, //creation flags NULL, NULL, //userProfilname &myStartInfo, //startinformation &myProcessInfo //prozessinformation );
das ist mein Code...^
SyD_Prog.c: In function `main': SyD_Prog.c:56: warning: passing arg 6 of `CreateProcessWithLogonW' discards qual ifiers from pointer target type SyD_Prog.c:56: warning: passing arg 7 of `CreateProcessWithLogonW' makes integer from pointer without a cast SyD_Prog.c:56: warning: passing arg 10 of `CreateProcessWithLogonW' from incompa tible pointer type
das ist meine ausgabe^
Wenn ich bei den letztn 3 NULLs den ersten auf 0 setze ist die Ausgabe wie folgt:
SyD_Prog.c: In function `main': SyD_Prog.c:56: warning: passing arg 6 of `CreateProcessWithLogonW' discards qual ifiers from pointer target type SyD_Prog.c:56: warning: passing arg 10 of `CreateProcessWithLogonW' from incompa tible pointer type
Aber wieso mecker er noch?
-
Du solltest dich etwas besser an die entsprechenden Typen halten! Du verwendest die Wide-Version der Funktion (CreateProcessWithLogonW). Wenn da was von einem LPCWSTR steht nimmt man keinen Ansi-String und castet ihn auf LPCWSTR! Mach das so:
L"ladmin"
Das 'L' vor dem String sagt dem Compiler, dass es ein Wide-String ist, so wie es die Funktion verlangt. Genauso wie man für den Wert eines DWORD nicht NULL sondern 0 einsetzen sollte. Parameter 6 ist ein LPWSTR, also nicht const. Param 7 ist wie du auch schon herausgefunden hast ein DWORD also 0, nicht NULL. Und ich nehme an du hast für den Param 10 nicht die LPSTARTUPINFOW Struktur genommen, sondern die LPSTARTUPINFOA oder einfach LPSTARTUPINFO und kompilierst mit Ansi.
-
Ist Dir eigentlich der Unterscheid zwiswchen einem char* und einem wchar_t* bekannt? Wenn nicht solltest Du das erstmal lernen, ansonsten brauchen wir hier nicht weiter zu machen.
Und bitte versuche mal zu verstehen was für ein Quatsch Deine Casts sind.
-
retValue = CreateProcessWithLogonW( L"ADMIN", //benutzer (LPCWSTR)'.', //domaine L"AMDIN", //pw LOGON_WITH_PROFILE, //flags NULL, //program name L"SyD_Watch.exe", //like system( "command" ) 0, //creation flags NULL, NULL, //userProfilname &myStartInfoW, //startinformation &myProcessInfo //prozessinformation );
Jetzt läufts.
Ok also
yogle schrieb:
Du solltest dich etwas besser an die entsprechenden Typen halten!
Das versuche ich mit diesem (TYPECASTHERE) gedöns, so kenne ich das, da T"admin" nicht funktioniert hat...
yogle schrieb:
Du verwendest die Wide-Version der Funktion (CreateProcessWithLogonW).
^^dafür steht also das W.. Danke
yogle schrieb:
Wenn da was von einem LPCWSTR steht nimmt man keinen Ansi-String und castet ihn auf LPCWSTR! Mach das so:[...]
Danke, aber was nehm ich für arg 2?
yogle schrieb:
Und ich nehme an du hast für den Param 10 nicht die LPSTARTUPINFOW Struktur genommen, sondern die LPSTARTUPINFOA oder einfach LPSTARTUPINFO und kompilierst mit Ansi.
STARTUPINFO myStartInfo;
So habe ich das bis jetzt immer gemacht, ist die STARTUPINFOW genau gleich?(scheint so compiler meckert nicht.)
Martin Richter schrieb:
Ist Dir eigentlich der Unterscheid zwiswchen einem char* und einem wchar_t* bekannt?
char* ist ein Pointer auf ein bereich im Speicher mit charactern.
wchar_t* ist auch ein pointer auf einen Speicherbereich allerdings mit wide-charactern, wobei ich nicht weiß was wide mit charactern zu tun hat, das _t kann ich dir nicht erklären, so kann ich darüber was lesen?Dake für die Antworten
-
Okay schon besser, doch so ganz am Ziel der Erkenntnis sind wir noch nicht angelangt. Prinzipiell solltest du dir vornehmen, beim Funktionsparameters nicht zu casten.
lippoliv schrieb:
yogle schrieb:
Du solltest dich etwas besser an die entsprechenden Typen halten!
Das versuche ich mit diesem (TYPECASTHERE) gedöns, so kenne ich das, da T"admin" nicht funktioniert hat...
Versuch mal
TEXT("admin")
das sollte gehen. Für den Parameter 2 machst du es genauso wie bei 1 und 3. Er möchte da einen Wide-String (kein einzelner Character) also gibts du ihm das
L"."
Parameter 5 ist kein LPCWSTR! Das heißt du darfst ihm nicht solch einen String übergeben. Doku lesen:
MSDN schrieb:
lpCommandLine: The function can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
Du musst einen String via malloc/new allokieren und der Funktion übergeben, damit sie ihn verändern kann.
typedef struct _STARTUPINFOA { DWORD cb; LPSTR lpReserved; LPSTR lpDesktop; LPSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFOA, *LPSTARTUPINFOA; typedef struct _STARTUPINFOW { DWORD cb; LPWSTR lpReserved; LPWSTR lpDesktop; LPWSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFOW, *LPSTARTUPINFOW; #ifdef UNICODE typedef STARTUPINFOW STARTUPINFO; typedef LPSTARTUPINFOW LPSTARTUPINFO; #else typedef STARTUPINFOA STARTUPINFO; typedef LPSTARTUPINFOA LPSTARTUPINFO; #endif // UNICODE
Es gibt für (fast) jede WinAPI Funktion eine Ansi und eine Wide Variante. Also entweder CreateProcessWithLogonW oder CreateProcessWithLogonA die Funktion CreateProcessWithLogon existiert so gar nicht, sondern ist nur ein Makro auf eine der beiden Funktionen. Der Compiler entscheidet dann welche er verwendet, abhängig ob du für Unicode (Wide) oder für Multi-Byte (Ansi/UTF) kompilierst. Das gleiche gilt für Strukturen die Strings enthalten (STARTUPINFO). Wenn du ihm vorgibst die Wide-Variante zu verwenden musst du ihm auch die passenden Parameter liefern.
-
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