Programm als Administrator starten
-
Hallo,
zur Administration des Firmennetzwerkes brauche ich eine Funktion mit der ich ein Programm als Administrator starten kann. Ohne das ein sich ein Fenster öffnet wo Benutzername + Passwort eingegeben werden muss.
Hatte daran gedacht den Account und das Passwort im Quelltext zu speichern und das Programm dann unter diesen Account zu starten.
Gibt es so eine Funktion?Mit freundlichen Grüßen
-
Jönnte vielleicht helfen. Habs nur überflogen
[url]
http://msdn.microsoft.com/en-us/library/ms682431(VS.85).aspx
[/url]
-
Das ist nach meinem Wissen unmöglich. Alle Verfahren die einen neuen Login erzeugen, erzegen immer einen restricted Token. Selbst wenn Du also Benutzername/Kennwort angibst, wird der Admin Token entfernt und der Prozess ist nicht elevated.
Man kann den UAC Prompt so nicht umgehen.
-
Was passiert mit ImpersonateLoggedOnUser?
-
Link vergessen: http://www.michael-puff.de/Artikel/Impersonate.shtml
-
Ich benutze dieses Programm in XP:
// RunAsAdmin.cpp // running processes in other user account // usage: RunAsAdmin.exe "full path\your program.exe" {parameters} #include <shlwapi.h> #include <Userenv.h> #pragma comment(lib,"Shell32.lib") // target user account informations #define LOGIN L"Administrator" //#define PASSWORD L"" // PW ist optional #define DOMAIN L"." void RegisterSelf() { WCHAR wszRegExe[MAX_PATH]; DWORD type, cb=64; // query registry path for .exe if (!SHGetValueW(HKEY_CLASSES_ROOT, L".exe", NULL, &type, wszRegExe, &cb)) { // append path for verbs // SHSetValue: HKCR\exefile\shell\run as administrator\command // oder besser HKCU\software\classes\exefile\shell\run as administrator\command lstrcatW(wszRegExe, L"\\shell\\Run as "); lstrcatW(wszRegExe, LOGIN); lstrcatW(wszRegExe, L"\\command"); // query path to this programm WCHAR wszMainPath[MAX_PATH + 10]; GetModuleFileNameW(0, wszMainPath, MAX_PATH); // add quotes the path if contain spaces PathQuoteSpacesW(wszMainPath); // append "%1" %* lstrcatW(wszMainPath, L" \"%1\" %%*"); // add new verb - Run as System if (!SHSetValueW(HKEY_CLASSES_ROOT, wszRegExe, NULL, REG_SZ, wszMainPath, (lstrlenW(wszMainPath)+1)<<1)) MessageBoxW(0, L"Instalation completed", L"", MB_ICONINFORMATION); } } //int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT) int main() { STARTUPINFOW si; PROCESS_INFORMATION pi; WCHAR *lpCmd = PathGetArgsW(GetCommandLineW()); if (*lpCmd == 32) lpCmd = &lpCmd[1]; if (!*lpCmd) // no parameters given { RegisterSelf(); } else { ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); int argc; LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(), &argc); // extract executable directory from path WCHAR wszCurrentDirectory[MAX_PATH]; lstrcpynW(wszCurrentDirectory, argv[1], MAX_PATH); PathRemoveFileSpecW(wszCurrentDirectory); #ifdef PASSWORD BOOL created = CreateProcessWithLogonW(LOGIN, DOMAIN, PASSWORD, LOGON_WITH_PROFILE, NULL, lpCmd, 0,0, wszCurrentDirectory, &si, &pi); #else // enable blank passwords (XP) BOOL limit = 0; SHSetValueW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Lsa", L"limitblankpassworduse", REG_DWORD, &limit, 4); // do not crash until limitblankpassworduse is set back to 1 BOOL created = CreateProcessWithLogonW(LOGIN, DOMAIN, NULL, LOGON_WITH_PROFILE, NULL, lpCmd, 0,0, wszCurrentDirectory, &si, &pi); // disable blank passwords (default) limit = 1; SHSetValueW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Lsa", L"limitblankpassworduse", REG_DWORD, &limit, 4); #endif if (created) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } else { FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, GetLastError(), 0, wszCurrentDirectory, MAX_PATH, NULL); MessageBoxW(0, wszCurrentDirectory, L"CreateProcessWithLogon error", MB_TOPMOST | MB_ICONSTOP); MessageBoxW(0, lpCmd, L"CreateProcessWithLogon error", MB_TOPMOST | MB_ICONSTOP); } LocalFree(argv); } }