Если вы заключите всю функцию в оператор if, например:
param([switch]$Elevated)
if($elevated) {
...script code here
}
Тогда вы можете вызвать функцию с этим параметром, например. "scriptname.ps1" - повышен для выполнения того, что находится внутри блока сценария. Вместо этого просто звоню. "scriptname.ps1" без параметра -Elevated ничего не сделает, потому что вы нажмете свой оператор if:
if ($elevated) {
, а повышенный не существует, что означает, что внутри блока сценария ничего не выполняется.
Я не вижу цели делать это в вашем случае, потому что, если у вас уже есть logi c, чтобы решить, следует ли передавать true или false, почему бы просто не использовать этот logi c, чтобы решить, следует ли вызывать сценарий вообще? Я предполагаю, что вы на самом деле не имеете в виду, что вы хотите выполнить весь скрипт только в том случае, если пользователь «повышен», а скорее проверьте, можно ли его повысить в скрипте, а затем сделайте что-то еще.
In В этом случае вам следует взглянуть на Расширенные функции PowerShell . Вы можете сделать что-то вроде этого:
# Get variables
$registryPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WinRM\Client"
$key1 = "AllowDigest"
$key2 = "AllowUnencryptedTraffic"
$key3 = "AllowBasic"
$off = "00000000"
$on = "00000001"
# enables admin privileges
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$isAdmin = $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
return $isAdmin
}
function Do-TheRestOfTheThings {
[CmdletBinding()]
param()
Get-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
If (!(Test-Path $registryPath)) {
New-Item -Path $registryPath -Force | out-Null
New-ItemProperty -Path $registryPath -Name $key1 -Value $off -PropertyType DWORD -Force | Out-Null
New-ItemProperty -Path $registryPath -Name $key2 -Value $off -PropertyType DWORD -Force | Out-Null
New-ItemProperty -Path $registryPath -Name $key3 -Value $on -PropertyType DWORD -Force | Out-Null
#'registry key did not exist'
exit
}
Else {
New-ItemProperty -Path $registryPath -Name $key1 -Value $off -PropertyType DWORD -Force | Out-Null
New-ItemProperty -Path $registryPath -Name $key2 -Value $off -PropertyType DWORD -Force | Out-Null
New-ItemProperty -Path $registryPath -Name $key3 -Value $on -PropertyType DWORD -Force | Out-Null
#'registry key exists'
}
}
if(Test-Admin) {
Do-TheRestOfTheThings
}
else {
'tried to elevate, did not work, aborting...'
}