Seite 1 von 1

Programm als Benutzer nicht-Administrator starten?

Verfasst: 16.04.2013 12:49
von _JON_
Hallo Leute,
mein Programm bekommt ein hübsches Setup, welches am Ende eine Option anbietet um das Programm zu starten.
Das Setup läuft natürlich mit Administratorrechten, aber das Programm sollte nur mit Standardrechten starten.
Hat jemand so was schon probiert?

Re: AW: Programm als Benutzer nicht-Administrator starten?

Verfasst: 16.04.2013 13:10
von Thorsten1867
Wenn du dir die Arbeit für das Setup sparen willst, kannst du gerne auch mein EasySetup nutzen. ;-)

Re: Programm als Benutzer nicht-Administrator starten?

Verfasst: 16.04.2013 13:29
von Josh
_JON_ hat geschrieben:Das Setup läuft natürlich mit Administratorrechten, aber das Programm sollte nur mit Standardrechten starten.
Ist zwar genau das umgekehrte, aber schau mal hier. Vielleicht hilft es dir weiter.

@Thorsten1867:
Dein Link funktioniert nicht.

Re: Programm als Benutzer nicht-Administrator starten?

Verfasst: 16.04.2013 14:59
von _JON_
@Thorsten
EasySetup sieht gut aus, vielleicht spar ich mir ein eigenes Setup-programm zu erstellen.

Habe nun schon eine Lösung gefunden:

Code: Alles auswählen

Import "advapi32.lib"
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    CreateProcessWithToken_(hToken.i, dwLogonFlags.l, lpApplicationName.i, lpCommandLine.i, dwCreationFlags.l, lpEnvironment.i, lpCurrentDirectory.i, lpStartupInfo.i, lpProcessInfo.i) As "_CreateProcessWithTokenW@36"    
  CompilerElse
    CreateProcessWithToken_(hToken.i, dwLogonFlags.l, lpApplicationName.i, lpCommandLine.i, dwCreationFlags.l, lpEnvironment.i, lpCurrentDirectory.i, lpStartupInfo.i, lpProcessInfo.i) As "CreateProcessWithTokenW"
  CompilerEndIf
EndImport

Procedure RunWithPidToken(lPid.l, sPath.s, sParameter.s = "", sWorkingDir.s = "")
  
  Protected StartupInfo.StartupInfo
  StartupInfo\cb = SizeOf(StartupInfo)
  StartupInfo\dwFlags = #STARTF_USESHOWWINDOW
  StartupInfo\wShowWindow = #SW_NORMAL
  
  Protected sPara.s, sWork.s
  
  If sParameter <> ""
    sPara = sParameter
  EndIf
  
  If sWorkingDir <> ""
    sWork = sWorkingDir
  EndIf
  
  Protected PROCESS_INFORMATION.PROCESS_INFORMATION

  Protected hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION, 0, lPid), hToken, hnewToken
  If hProcess
    OpenProcessToken_(hProcess, #TOKEN_DUPLICATE, @hToken) 
    DuplicateTokenEx_(hToken, #TOKEN_ALL_ACCESS, 0, 2, 1, @hnewToken)
    CreateProcessWithToken_(hnewToken, 0, @sPath, @sPara, 0, 0, @sWork, StartupInfo, PROCESS_INFORMATION)
    CloseHandle_(hnewToken)
    CloseHandle_(hToken)
    CloseHandle_(hProcess)
  EndIf

EndProcedure

Procedure GetPID(ProcessName.s)
  hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null)
  If hSnapShot
    iResult = -1
    pInfo.PROCESSENTRY32
    pInfo\dwsize    = SizeOf(PROCESSENTRY32)
    bProcAvailable  = Process32First_(hSnapShot, @pInfo)
    While(bProcAvailable) And (Not iResult = 0)
      bProcAvailable = Process32Next_(hSnapShot, @pInfo)
      iResult = CompareMemoryString(@pInfo\szExeFile,@ProcessName,1)
    Wend
    CloseHandle_(hSnapShot)
    ProcedureReturn pInfo\th32ProcessID
  EndIf
EndProcedure

RunWithPidToken(GetPID("explorer.exe"), "cmd.exe", "", "")

Re: Programm als Benutzer nicht-Administrator starten?

Verfasst: 16.04.2013 16:55
von ts-soft
Der einfache und meist übliche Weg ist:
Ein Programm mit Userrechten starten, dies entpackt nur die Dateien (meist nach temp), überprüft den freien Platz usw.
Danach das eigentlich Setup mit "runas" starten und warten, bis dies beendet ist, dann die installierte
Applikation starten.

Ansonsten: Ein eigenes Setup-Programm selber zu schreiben ist schwachfug! Bis man da alles richtig macht,
vergehen Wochen/Monate. Dann lieber eins der vielen schon verfügbaren Setupprogramme nutzen, die schon länger
getested wurden. Es ist jedenfalls eine Menge an Hintergrundwissen und Erfahrung nötig, um selbst das
einfachste Setup in vernünftiger Form selber zu erstellen. Solange man kein Setup-Programm an sich erstellen
möchte, sondern nur für einmalige Nutzung im eigenem Programm, sollte man das Rad nicht neu erfinden, zu
mal die Gefahr gross ist, das dieses neue Rad erstmal eiert :mrgreen:

Re: Programm als Benutzer nicht-Administrator starten?

Verfasst: 16.04.2013 19:03
von _JON_
ts-soft hat geschrieben:Der einfache und meist übliche Weg ist:
Ein Programm mit Userrechten starten, dies entpackt nur die Dateien (meist nach temp), überprüft den freien Platz usw.
Danach das eigentlich Setup mit "runas" starten und warten, bis dies beendet ist, dann die installierte
Applikation starten.
Hmm, an so was einfaches habe ich gar nicht gedacht.
Nu gut mein Code ist trotzdem noch nützlich, z.B. um eine Webbrowser aus einem elevated Prozess zu starten.

Re: Programm als Benutzer nicht-Administrator starten?

Verfasst: 16.04.2013 19:19
von ts-soft
_JON_ hat geschrieben:Hmm, an so was einfaches habe ich gar nicht gedacht.
Naja, das Alter macht weise :lol:

Bin früher auch meist über ROM von Berlin nach Hamburg gefahren <)

Re: Programm als Benutzer nicht-Administrator starten?

Verfasst: 17.04.2013 03:39
von purebas
Kann EasySetup als Ersatz für eine Autostart-Verknüpfung oder dem Eintrag im Run-Schlüssel der Registry
eine Aufgabe bei Benutzeranmeldung anlegen?

Ich habe nämlich bemerkt, dass unter Windows8 die alten Startmöglichkeiten mit einer spürbaren Verzögerung
im Vergleich mit einer Startaufgabe durchgeführt werden.

Re: AW: Programm als Benutzer nicht-Administrator starten?

Verfasst: 19.04.2013 16:20
von Thorsten1867
Alles, was "Easy" übersteigt' findet man bei EasySetup bei den benutzerdefinierten Aufgaben.
Es ist also auch möglich Registry-Einträge oder Verknüpfungen im Autostart-Ordner zu erstellen.
ts-soft hat recht, ein Setup-Programmen zu schreiben, ist ein Projekt von vielen Monaten. Hätte ich das damals schon gewusst, was damit auf mich zukommt, hätte ich es mir vielleicht nochmal überlegt. ;-) (Ja, damals war ich halt noch jung und naiv und mich hat niemand gewarnt :-D )