Функция для включения аутентификации basi c через powershell - PullRequest
1 голос
/ 19 июня 2020

Я создал сценарий PowerShell, который включает базовую c аутентификацию. Мне это нужно, чтобы WinRM могла работать при запуске некоторых из наших старых скриптов PowerShell. Что мне теперь нужно сделать, так это иметь возможность вызвать этот сценарий как функцию с аргументом true false. например, отключить или включить аутентификацию basi c. Как я могу превратить этот код в функцию, чтобы я мог вызывать ее из других сценариев PowerShell?
Итак, если я отправлю команду этому сценарию, например,
basicauth ($ true) - он запустит сценарий как есть
basicauth ($ false - отключит базовую c аутентификацию
Я могу создать альтернативный оператор if else, когда ему будет отправлено истинное значение false, но я не уверен, как я могу обернуть весь скрипт в функцию.
Приносим извинения за статус новичка в PowerShell, мне потребовалось некоторое время, чтобы заставить этот скрипт работать так, как он есть.

param([switch]$Elevated)
# 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())
  $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false)  {
    if ($elevated) 
    {
        'tried to elevate, did not work, aborting...'
    } 
    else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}
exit
}

# checks if the registry path is available, before adding the registry key values
        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'
            exit
        }

ПРИМЕЧАНИЕ. Теперь я знаю, что оператор Else должен иметь следующие значения: Set -ItemProperty, хотя если я изменю код на Set-ItemProperty, скрипт перестанет работать, единственный способ, которым у меня это работает, - это сделать его как New-ItemProperty. На самом деле это не имеет смысла, но работает.
В идеале это было бы лучше просто обновить текущие сценарии PowerShell для использования современной аутентификации, но их сотни, поэтому для меня это не очень жизнеспособный вариант. * 10 10 * Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 23 июня 2020

Если вы заключите всю функцию в оператор 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...'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...