2016-10-12 3 views
1

У меня есть довольно много компьютерных систем, которые нам нужно развернуть. Я использовал простой метод для определения, является ли пользователь локальным администратором, а затем обнаруживает, имеют ли они права администратора. При необходимости сценарий перезагружается с повышенными привилегиями. Если пользователь не является локальным администратором, сценарий перезаписывается с использованием других учетных данных (локальный администратор). Сценарий отлично работает на системах с более поздней версией PowerShell, таких как Windows 8 и Windows 10.Перезапуск сценария PowerShell как пользователя admin

Проблема заключается в том, что пользователь не является администратором, а сценарий работает в Windows 7. Сценарий использует $PSScriptPath для повторного запуска сценарий. Я не думаю, что это работает в более ранних версиях PowerShell. Поэтому я попытался установить $PSScriptRoot сам, если версия Major PowerShell - < 3. Проблема заключается в том, что скрипт застрял в какой-то петле, где он постоянно открывается и закрывает окна, а затем я должен убить его ... Если я «т определить $PSScriptRoot я получаю ошибку

Невозможно привязать аргумент параметра„Путь“, потому что он является недействительным

Я предполагаю, что это потому, что $PSScriptRoot не определен в PowerShell 2.0.

Вот пример того, что я пытаюсь сделать:

#Check if PowerShell version is greater than 2. If not, set $PSSriptRoot. 
if ($PSVersionTable.PSVersion.Major -lt 3) { 
    $PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition 
} 

#Check if the user is a local admin. If they are, set $LocalAdmin to $True. 
$LocalAdmin = $false 
if ((net localgroup administrators) -match ([System.Environment]::UserDomainName + "\\" + [System.Environment]::Username)) { 
    $LocalAdmin = $true 
} 
if ($LocalAdmin) { 
    #Check if the local admin needs to run the script as administrator 
    if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { 
     $arguments = "& '" + $MyInvocation.MyCommand.Definition + "'" 
     Start-Process powershell -Verb runas -ArgumentList $arguments 
     break 
    } 
} else { 
    #Not a local admin. Relaunch script as admin user. 
    Start-Process -Credential $credential (Join-Path $PSHome powershell.exe) -ArgumentList (@("-File", 
     (Join-Path $PSScriptRoot $MyInvocation.MyCommand)) + $args) 
    exit 
} 

ответ

1

Не переопределять automatic variables. Ничего хорошего из этого не выйдет.

Кроме того, почему вы так или иначе хотите? Единственное, что вы используете: $PSScriptRoot, - это восстановить уже имеющийся скрипт. Просто назначьте этот путь переменной и используйте ее в своем скрипте.

$script = $MyInvocation.MyCommand.Definition 
$ps  = Join-Path $PSHome 'powershell.exe' 

$isLocalAdmin = [bool]((net localgroup administrators) -match "$env:USERDOMAIN\\$env:USERNAME") 

if ($isLocalAdmin) { 
    if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]'Administrator')) { 
     Start-Process $ps -Verb runas -ArgumentList "& '$script'" 
     exit 
    } 
} else { 
    Start-Process $ps -ArgumentList (@('-File', $script) + $args) -Credential $credential 
    exit 
} 
+0

спасибо. Я понял свою ошибку с зацикленными окнами. Я действительно оценил совет и нашел время, чтобы объяснить. Приветствия. – Cormang