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-Key: 267632

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

Printed on: April 27, 2024 at 05:04 o'clock

Member: TlBERlUS
TlBERlUS Mar 27, 2015 at 12:23:24 (UTC)
Goto Top
Hi,

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

Grüße,

Tiberius
Member: Bugger
Bugger Mar 27, 2015 at 12:52:16 (UTC)
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"  
Mitglied: 114757
114757 Mar 27, 2015 at 14:35:43 (UTC)
Goto Top
Member: colinardo
colinardo Mar 27, 2015 updated at 16:52:09 (UTC)
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
Member: Bugger
Bugger Mar 30, 2015 at 10:19:47 (UTC)
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
Member: colinardo
Solution colinardo Mar 30, 2015, updated at Apr 29, 2015 at 07:39:03 (UTC)
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."  
Member: Bugger
Bugger Mar 30, 2015 at 10:33:30 (UTC)
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.
Member: colinardo
colinardo Mar 30, 2015 updated at 10:44:35 (UTC)
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 !!
Member: Bugger
Bugger Mar 30, 2015 at 11:42:52 (UTC)
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