2016-10-12 17 views
1

私はソフトウェアを展開するために必要なコンピュータシステムがかなりあります。私は、ユーザーがローカル管理者であるかどうかを検出し、管理者権限を持っているかどうかを検出する単純な方法を使用してきました。必要に応じて、スクリプトは昇格された特権で再起動します。ユーザーがローカル管理者でない場合、スクリプトは別の資格情報(ローカル管理者)を使用して再起動します。このスクリプトは、Windows 8やWindows 10など、PowerShellの新しいバージョンのシステムでうまく機能します。adminユーザーとしてPowerShellスクリプトを再起動

問題は、ユーザーが管理者でなく、スクリプトがWindows 7で実行されている場合です。このスクリプトは、$PSScriptPathを使用して再起動します。スクリプト。 PowerShellの以前のバージョンではこれはうまくいかないと思います。だから私は、$PSScriptRootのメジャーPowerShellのバージョンが<であると設定しようとしました。問題は、スクリプトが何らかの種類のループに詰まって、ウィンドウが絶えず開いて閉じてしまっていて、 「tは私がエラー

は、パラメータの引数をバインドすることはできません取得$PSScriptRootを定義 『がnullであるため、

パス』を

私は$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

関連する問題