none
PowerShell: Pfad auf einer Datei auf USB-Stick ermitteln und in dieses Verzeichnis wechseln? RRS feed

  • Frage

  • Hallo zusammen,

    ich soll per PowerShell-Skript u.a. eine .exe-Datei ausführen. Jedoch sollen sowohl das Skript als auch die .exe auf einem USB-Stick von Rechner zu Rechner herumgereicht werden. Hinzu kommt, dass man für das ausführen der .exe-Datei Administrationsrechte benötigt. Deshalb würde ich am Anfang des Skripts

    Start-Process powershell -Verb runAs

    setzen, dies ändert jedoch den Pfad der PowerShell auf "C:\Windows\System32". Gibt es eine Möglichkeit ein Powershell-Skript als Administrator auszuführen ohne, dass sich der Pfad ändert (sodass ich das Skript und die .exe einfach zusammen auf dem USB-Stick lassen kann) oder dass ich ins Verzeichnis der .exe auf dem USB-Stick zurück wechseln kann?

    Danke für eure Bemühungen.

    MfG

    Mittwoch, 28. Juni 2017 13:57

Antworten

  • Hallo Hawk,

    das dürfte glaube ich mit

    split-path $SCRIPT:MyInvocation.MyCommand.Path -parent

    Machbar sein, du holst dir hiermit die Location deines Scripts :)

    Gruß

    Carsten


    http://www.ms-fabric.de/ Wenn Dir eine Forenantwort weiter geholfen hat dann markiere sie doch bitte als Antwort, dies hilft anderen bei der Lösung von Problemen! LG Carsten

    Mittwoch, 28. Juni 2017 14:14
  • Hallo Hawk,

    probiere es mal hiermit und füge das an den Anfang deines Scripts:

    #### Get UserID and security principal of the current user
    $CurrentWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
    $CurrentWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($CurrentWindowsID)
    
    #### Get administrator role security principal
    $LocalAdminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator
    
    
    #### Check for elevated rights
    if ($CurrentWindowsPrincipal.IsInRole($LocalAdminRole))
    {
    	#### Currently running with elevated rights
    	$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"
    	Write-Host "Currently running with elevated rights" -ForegroundColor Green
    	Clear-Host
    }
    
    else 
    {
    	### Currently NOT running with elevated rights 
    	$ElevatedProcess = New-Object System.Diagnostics.ProcessStartInfo "PowerShell"
    	$ElevatedProcess.Arguments = "-WindowStyle Hidden & '" + $script:MyInvocation.MyCommand.Path + "'"
    	$ElevatedProcess.Verb = "runas"
    	$ElevatedProcess.WorkingDirectory = $Script:myInvocation.MyCommand.Path
    
    	try
    	{
    		[System.Diagnostics.Process]::Start($ElevatedProcess);
    	}
    	
    	catch
    	{
    		Write-Host "Could not start PowerShell with elveated rights" -ForegroundColor Red
    		$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    	}
    	
    	Exit
    }
    
    ############################################################################
    #                                                                          #
    #       Enter your code to execute with elevated rights below              #
    #                                                                          #
    ############################################################################

    Das Script ruft sich dann selbst mit Administrationsrechten wieder auf. Als Workingdirectory wird der Pfad zum Script mitgegeben, somit solltest du mit deiner .exe kein Problem mehr haben.

    Gruß

    Tim

    Donnerstag, 29. Juni 2017 13:44

Alle Antworten

  • Hallo Hawk,

    das dürfte glaube ich mit

    split-path $SCRIPT:MyInvocation.MyCommand.Path -parent

    Machbar sein, du holst dir hiermit die Location deines Scripts :)

    Gruß

    Carsten


    http://www.ms-fabric.de/ Wenn Dir eine Forenantwort weiter geholfen hat dann markiere sie doch bitte als Antwort, dies hilft anderen bei der Lösung von Problemen! LG Carsten

    Mittwoch, 28. Juni 2017 14:14
  • Nach dem Run-AS setze doch einfach das Arbeitsverzeichnis neu:
    https://msdn.microsoft.com/en-us/powershell/scripting/getting-started/cookbooks/managing-current-location
    Mittwoch, 28. Juni 2017 14:30
  • Du kannst auch einfach alle Laufwerksbuchstaben durchprüfen, ob es die exe-Datei gibt.

    $Pfad = "PfadZuDeinerExe"
    
    65..90 | foreach{[char][byte]$_} | where{Test-Path ("$_`:\$Pfad")}


    Donnerstag, 29. Juni 2017 11:27
  • Hallo Hawk,

    probiere es mal hiermit und füge das an den Anfang deines Scripts:

    #### Get UserID and security principal of the current user
    $CurrentWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
    $CurrentWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($CurrentWindowsID)
    
    #### Get administrator role security principal
    $LocalAdminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator
    
    
    #### Check for elevated rights
    if ($CurrentWindowsPrincipal.IsInRole($LocalAdminRole))
    {
    	#### Currently running with elevated rights
    	$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"
    	Write-Host "Currently running with elevated rights" -ForegroundColor Green
    	Clear-Host
    }
    
    else 
    {
    	### Currently NOT running with elevated rights 
    	$ElevatedProcess = New-Object System.Diagnostics.ProcessStartInfo "PowerShell"
    	$ElevatedProcess.Arguments = "-WindowStyle Hidden & '" + $script:MyInvocation.MyCommand.Path + "'"
    	$ElevatedProcess.Verb = "runas"
    	$ElevatedProcess.WorkingDirectory = $Script:myInvocation.MyCommand.Path
    
    	try
    	{
    		[System.Diagnostics.Process]::Start($ElevatedProcess);
    	}
    	
    	catch
    	{
    		Write-Host "Could not start PowerShell with elveated rights" -ForegroundColor Red
    		$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    	}
    	
    	Exit
    }
    
    ############################################################################
    #                                                                          #
    #       Enter your code to execute with elevated rights below              #
    #                                                                          #
    ############################################################################

    Das Script ruft sich dann selbst mit Administrationsrechten wieder auf. Als Workingdirectory wird der Pfad zum Script mitgegeben, somit solltest du mit deiner .exe kein Problem mehr haben.

    Gruß

    Tim

    Donnerstag, 29. Juni 2017 13:44
  • zwar kein Powershell Tipp, aber warum gibst du dem USB Laufwerk nicht einen fixen Buchstaben.

    Chris

    Donnerstag, 29. Juni 2017 15:56
  • Ich vermute mal, weil der Stick, wie in ganz oben geschildert, von Rechner zu Rechner herumgereicht werden soll.

    Vielleicht wäre ja auch eine andere "Transportmethode" als ein USB-Stick wesentlich zielführender und leichter zu kontrollieren!?  ;-)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 29. Juni 2017 17:51