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%")