appcmd.exe set config не проверяет, является ли имя пользователя или пароль недействительным, и все равно устанавливает его - PullRequest
0 голосов
/ 11 июля 2020

Я использую winexe из моего backend api для выполнения команд на Windows сервере домена. Я хочу установить удостоверение пула приложений IIS в качестве учетной записи из Active Directory. Проблема в том, что при использовании этой команды:

<code>%windir%\system32\inetsrv\appcmd.exe set config /section:applicationPools ^
/[name='POOLNAME'].processModel.identityType:SpecificUser ^
/[name='POOLNAME'].processModel.userName:DOMAIN\USER ^
/[name='POOLNAME'].processModel.password:PASSWORD

она запускается успешно каждый раз, даже если имя пользователя и пароль неверны. Даже пул запускается с неправильным паролем. Однако установка неправильного пароля через GUI не выполняется.

Я хочу определить, когда пароль или имя пользователя установлены неправильно.

PS: Я даже пробовал использовать Set-ItemProperty на PowerShell, результат был таким же.

1 Ответ

1 голос
/ 11 июля 2020

Вы не можете проверить свои учетные данные с помощью AppPool, но вы определенно можете проверить их.

# Service Principal credentials
$username = 'Username'
$password = 'Password' | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object -TypeName 'System.Management.Automation.PSCredential' -ArgumentList $username, $password


if (Test-Credential -Credential $credential) {
    Write-Verbose "Credentials for $($credential.UserName) are valid..."
    # do the appcmd stuff
}
else {
    Write-Warning 'Credentials are not valid or some other logic'
}

Просто добавьте Test-Credential определение функции в верхней части вашего скрипта

function Test-Credential {
    [CmdletBinding()]
    Param
    (
        # Specifies the user account credentials to use when performing this task.
        [Parameter()]
        [ValidateNotNull()]
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()]
        $Credential = [System.Management.Automation.PSCredential]::Empty
    )
   
    Add-Type -AssemblyName System.DirectoryServices.AccountManagement
    $DS = $null
    $Username = $Credential.UserName
    $SplitUser = $Username.Split('\')
    if ($SplitUser.Count -eq 2 ) {$Username = $SplitUser[1]}
    
    if ($SplitUser.Count -eq 1 -or $SplitUser[0] -eq $env:COMPUTERNAME ) {
        $DS = New-Object System.DirectoryServices.AccountManagement.PrincipalContext('machine', $env:COMPUTERNAME)
    }
    else {
        try {
            $DS = New-Object System.DirectoryServices.AccountManagement.PrincipalContext('domain')
        }
        catch {
            return $false
        }
    }
        
    $DS.ValidateCredentials($Username, $Credential.GetNetworkCredential().Password)
   
}

(PS: код действителен, даже если prettifier прерывается с backsla sh синтаксис кавычек)

...