Das Problem liegt an dem Wert 2 (= LOGON_NETCREDENTIALS_ONLY). Dies bewirkt, daß nicht das lokale User-Profil (z.B. das des Administrators) geladen wird (dauert möglicherweise einige Zeit). Dafür startet das gewünschte Programm im Kontext der User-ID, die aktuell angemeldet ist (was für einige Aufgaben auch sehr sinnvoll sein kann!). Also einfach den Wert 2 gegen 1 (= LOGON_WITH_PROFILE) tauschen und alles sollte laufen wie gewünscht...Barratator hat geschrieben:= CallFunction(0, "CreateProcessWithLogonW",user,".",pass,2,file,"",CREATE_DEFAULT_ERROR_MODE,null,null,StartupInfo,ProcessInfo)

MSDN-Link: http://msdn.microsoft.com/en-us/library/ms682431.aspx
Hier ein funktionierendes Beispiel zum Ausprobieren (einfach einmal mit #LOGON_NETCREDENTIALS_ONLY und #LOGON_WITH_PROFILE ausprobieren durch Ändern in dem CallFunctionFast-Aufruf sowie die Administrator-UserID und Passwort eintragen), das in einer Konsole ausgibt, in welchem User-Profil man nach dem RunAs-Aufruf arbeitet:
Code: Alles auswählen
EnableExplicit
#LOGON_WITH_PROFILE = 1
#LOGON_NETCREDENTIALS_ONLY = 2
Procedure.L RunAs(UserID.S, Password.S, DomainName.S, CommandLine.S)
Protected Buffer.S = Space(#MAX_PATH)
Protected *CommandLine = AllocateMemory(#MAX_PATH)
Protected *CurrentDirPath = AllocateMemory(#MAX_PATH)
Protected *DomainName = AllocateMemory(32)
Protected *LibFunction
Protected *Password = AllocateMemory(16)
Protected ProcessInfo.PROCESS_INFORMATION
Protected StartUpInfo.STARTUPINFO
Protected *UserID = AllocateMemory(16)
MultiByteToWideChar_(#CP_ACP, 0, UserID, -1, *UserID, #MAX_PATH)
MultiByteToWideChar_(#CP_ACP, 0, DomainName, -1, *DomainName, #MAX_PATH)
MultiByteToWideChar_(#CP_ACP, 0, Password, -1, *Password, #MAX_PATH)
MultiByteToWideChar_(#CP_ACP, 0, CommandLine, -1, *CommandLine, #MAX_PATH)
MultiByteToWideChar_(#CP_ACP, 0, GetTemporaryDirectory(), -1, *CurrentDirPath, #MAX_PATH)
If OpenLibrary(0, "ADVAPI32.DLL") = 0
MessageRequester("Fehler", "Die Programm-Bibliothek ADVAPI32.DLL konnte nicht geöffnet werden!", #MB_ICONERROR)
ProcedureReturn #False
Else
*LibFunction = GetFunction(0, "CreateProcessWithLogonW")
If *LibFunction
If CallFunctionFast(*LibFunction, *UserID, *DomainName, *Password, #LOGON_NETCREDENTIALS_ONLY, 0, *CommandLine, 0, 0, *CurrentDirPath, @StartUpInfo, @ProcessInfo) = 0
FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError_(), #LANG_NEUTRAL, @Buffer, #MAX_PATH, 0)
MessageRequester("Fehler", "Der Aufruf der Windows-Funktion CreateProcessWithLogonW() ist gescheitert:" + #CR$ + #CR$ + Buffer, #MB_ICONERROR)
ProcedureReturn #False
EndIf
Else
MessageRequester("Fehler", "Die Windows-Funktion CreateProcessWithLogonW() ist auf diesem PC nicht verfügbar!", #MB_ICONERROR)
ProcedureReturn #False
EndIf
CloseLibrary(0)
EndIf
ProcedureReturn #True
EndProcedure
Define AdminUserID.S = "XXX"
Define Password.S = "XXX"
Define Domainname.S = "."
RunAs(AdminUserID, Password, DomainName, "Cmd /K Echo %USERNAME%")
