bugger
Goto Top

Powershell Script mit Benutzerabfrage

Hallo,

ich würde gerne ein Script als anderer Benutzer ausführen. Sodass beim Starten des Scripts eine Abfrage nach dem Benutzer kommt, wie bei Get-Credentials.
Ich möchte aber nicht eine Extra Verknüpfung oder sowas haben, sondern alles in einem Script.

Dieses hier habe ich schon gefunden, funktioniert nur nicht:

# --

$identity = [Security.Principal.WindowsIdentity]::GetCurrent()  
$principal = new-object Security.Principal.WindowsPrincipal $identity 
$elevated = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)  

if ($elevated) {  
    write-warning "This script should be run elevated. Restarting..."  

    # restart script as admin, passing in any arguments to the new invocation
    Start-Process -credential (get-credential) (join-path $pshome powershell.exe) -ArgumentList (@("-file",  
        (join-path $psscriptroot $myinvocation.mycommand)) + $args)

    exit
}

"Hey, I'm admin. argc: {0}; argv: {1}" -f $args.Length, ($args -join ",")  

"Press any key to exit..."  
[console]::ReadKey()

#--

Oder könnte es damit zusammenhängen, dass kein Lokaler sondern ein Domänenbenutzer ist?

Content-ID: 267632

Url: https://administrator.de/contentid/267632

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

TlBERlUS
TlBERlUS 27.03.2015 um 13:23:24 Uhr
Goto Top
Hi,

runas sollte deine Anforderung erfüllen.
https://www.google.de/?gws_rd=ssl#q=powershell+runas

Grüße,

Tiberius
Bugger
Bugger 27.03.2015 um 13:52:16 Uhr
Goto Top
Und wie sollte das dann im Detail aussehen? Ich bekomme immer Der Verzeichnisname ist ungültig.

Start-Process powershell.exe -Credential "Domain\Administrator" -NoNewWindow -ArgumentList "Start-Process powershell.exe -Verb runAs"  
114757
114757 27.03.2015 um 15:35:43 Uhr
Goto Top
colinardo
colinardo 27.03.2015 aktualisiert um 17:52:09 Uhr
Goto Top
Hallo Bugger,
wenn es einfach nur darum geht das selbe Script mit "elevated" Rights zu starten geht das so:
Wenn du in einer Domäne bist und der aktuell verwendete User ist kein lokaler Admin bekommst du normalweise eine Eingabeaufforderung von der UAC in der du dich mit deinem gewünschten Account authentifizierst.
(Hinweis: Das Verb "runas" kann immer nur ohne Angabe von Credentials benutzt werden, man muss also eine Shell vorher mit den entsprechenden Rechten starten und darin dann die Powershell mit "runas" "elevaten" s. zweites Script)
$myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID)
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
if (!$myWindowsPrincipal.IsInRole($adminRole)){
    start-process "powershell" -Verb "runas" -ArgumentList "-File",$MyInvocation.MyCommand.Definition  
    exit
}
# Alles was hier kommt wird "elevated" ausgeführt 
write-host "Das Script wird mit den erhöhten Rechten des Users: '$($env:USERDOMAIN + "\" + $env:USERNAME)' ausgeführt."  
read-host "Drücken sie eine beliebige Taste um forzufahren"  


Möchtest du bein Start eine extra Eingabeaufforderung bekommen (vor der UAC) mit welchem User das Script "elevated" gestartet werden soll ginge das z.B. so
param(
    [switch]$invoked
)
if (!$invoked.IsPresent){
    $cred = Get-Credential
    Start-Process "powershell.exe" -Credential $cred -ArgumentList "-File",$MyInvocation.MyCommand.Definition,"-invoked"  
    exit
}else{
    $myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
    $myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID)
    $adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
    if (!$myWindowsPrincipal.IsInRole($adminRole)){
	start-process "powershell" -Verb "runas" -ArgumentList "-File",$MyInvocation.MyCommand.Definition,"-invoked"  
	exit
    }
}
# Alles was hier kommt wird "elevated" ausgeführt 
write-host "Das Script wird mit den erhöhten Rechten des Users: '$($env:USERDOMAIN + "\" + $env:USERNAME)' ausgeführt."  
read-host "Drücken sie eine beliebige Taste um forzufahren"  
Wurde hier beides in einer Domainumgebung getestet.

Grüße Uwe
Bugger
Bugger 30.03.2015 um 12:19:47 Uhr
Goto Top
Hallo,

vielen Dank für die Antworten. Das Script funktioniert aber kann man es auch so bauen, dass er nicht überprüft ob der Benutzer Administrator ist. Also einfach mit anderem Benutzernamen ausführen. Denn im Moment ist es ja so, dass es nur mit den Benutzern funktioniert die in der Rolle Administrator aufgeführt sind.

Gruß
Bugger
colinardo
Lösung colinardo 30.03.2015, aktualisiert am 29.04.2015 um 09:39:03 Uhr
Goto Top
sicher ...
param(
    [switch]$invoked
)
if (!$invoked.IsPresent){
    $cred = Get-Credential
    Start-Process "powershell.exe" -Credential $cred -ArgumentList "-File",$MyInvocation.MyCommand.Definition,"-invoked"  
    exit
}
# Alles was hier kommt wird unter dem anderen User-Account ausgeführt
write-host "Das Script wird mit den Rechten des Users: '$($env:USERDOMAIN + "\" + $env:USERNAME)' ausgeführt."  
read-host "Drücken sie die Enter-Taste um fortzufahren."  
Bugger
Bugger 30.03.2015 um 12:33:30 Uhr
Goto Top
Interessant ist, dass er immernoch die Rollen überprüft. Als Fehlermeldung bekomme ich immer: Der Verzeichnisname ist ungültig. Sobald ich den Domain Administrator zur Rolle hinzufüge, funktioniert es. Das ist allerdings leider keine Lösung.
colinardo
colinardo 30.03.2015 aktualisiert um 12:44:35 Uhr
Goto Top
Interessant ist, dass er immernoch die Rollen überprüft
Nein tut es nicht...
Verzeichnisname ist ungültig
Das kommt dann wenn dein Script in einem Verzeichnis liegt auf das dieser User keinen Zugriff hat face-wink !!
Bugger
Bugger 30.03.2015 um 13:42:52 Uhr
Goto Top
Ok ich habe es jetzt, zum einen saß der Fehler vorm Bildschirm. Und zum anderen mochte Powershell keine Dateinamen mit Leerzeichen. Hat vorher nie Probleme gemacht.^^

Aber jetzt funktioniert alles, vielen Dank für die Hilfe! face-smile