Сбой развертывания шаблона ARM с Chocolatey CSE на сценарии PS

Я следил за этим шаблоном ARM для создания виртуальной машины и развертывания приложений через Chocolatey:

https://github.com/Azure/azure-quickstart-templates/tree/master/visual-studio-dev-vm-chocolatey

Несмотря на то, что расширение на GitHub отображается как расширение для Linux, а не для MS (я изменил его в своем), мне удалось развернуть виртуальную машину. Однако сценарий автоматизации PowerShell для установки Chocolatey дает сбой.

Короче говоря, я обнаружил, что он отлично работает на сервере 2012, но не будет работать на сервере 2016.

Вот скрипт PowerShell:

param([Parameter(Mandatory=$true)][string]$chocoPackages)
cls

#New-Item "c:\jdchoco" -type Directory -force | Out-Null
#$LogFile = "c:\jdchoco\JDScript.log"
#$chocoPackages | Out-File $LogFile -Append

# Get username/password & machine name
$userName = "artifactInstaller"
[Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null
$password = $([System.Web.Security.Membership]::GeneratePassword(12,4))
$cn = [ADSI]"WinNT://$env:ComputerName"

# Create new user
$user = $cn.Create("User", $userName)
$user.SetPassword($password)
$user.SetInfo()
$user.description = "Choco artifact installer"
$user.SetInfo()

# Add user to the Administrators group
$group = [ADSI]"WinNT://$env:ComputerName/Administrators,group"
$group.add("WinNT://$env:ComputerName/$userName")

# Create pwd and new $creds for remoting
$secPassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential("$env:COMPUTERNAME\$($username)", $secPassword)

# Ensure that current process can run scripts. 
#"Enabling remoting" | Out-File $LogFile -Append
Enable-PSRemoting -Force -SkipNetworkProfileCheck

#"Changing ExecutionPolicy" | Out-File $LogFile -Append
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force

# Install Choco
#"Installing Chocolatey" | Out-File $LogFile -Append
$sb = { iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')) }
Invoke-Command -ScriptBlock $sb -ComputerName $env:COMPUTERNAME -Credential $credential | Out-Null

#"Disabling UAC" | Out-File $LogFile -Append
$sb = { Set-ItemProperty -path HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System -name EnableLua -value 0 }
Invoke-Command -ScriptBlock $sb -ComputerName $env:COMPUTERNAME -Credential $credential

#"Install each Chocolatey Package"
$chocoPackages.Split(";") | ForEach {
    $command = "cinst " + $_ + " -y -force"
    $command | Out-File $LogFile -Append
    $sb = [scriptblock]::Create("$command")

    # Use the current user profile
    Invoke-Command -ScriptBlock $sb -ArgumentList $chocoPackages -ComputerName $env:COMPUTERNAME -Credential $credential | Out-Null
}

Disable-PSRemoting -Force

# Delete the artifactInstaller user
$cn.Delete("User", $userName)

# Delete the artifactInstaller user profile
gwmi win32_userprofile | where { $_.LocalPath -like "*$userName*" } | foreach { $_.Delete() }

Если бы я открыл PowerShell ISE и запустил его непосредственно на компьютере с Server 2016, я получил бы следующие ошибки:

[asdf] Connecting to remote server asdf failed with the following error message : Access is denied. For more information, 
see the about_Remote_Troubleshooting Help topic.
    + CategoryInfo          : OpenError: (asdf:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionStateBroken
[asdf] Connecting to remote server asdf failed with the following error message : Access is denied. For more information, 
see the about_Remote_Troubleshooting Help topic.
    + CategoryInfo          : OpenError: (asdf:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionStateBroken
Out-File : Cannot bind argument to parameter 'FilePath' because it is null.
At line:48 char:25
+     $command | Out-File $LogFile -Append
+                         ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Out-File], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.OutFileCommand

[asdf] Connecting to remote server asdf failed with the following error message : Access is denied. For more information, 
see the about_Remote_Troubleshooting Help topic.
    + CategoryInfo          : OpenError: (asdf:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionStateBroken

'asdf' – это имя машины

Я могу запускать код шаг за шагом, но он всегда будет терпеть неудачу:

Invoke-Command -ScriptBlock $sb -ComputerName $env:COMPUTERNAME -Credential $credential

Я вижу, что создается учетная запись, создается пароль, ему назначаются права администратора, но я предполагаю, что где-то ему просто не нравится, как учетные данные передаются в команду. Почему это работает для 2012, а не для 2016, я понятия не имею. Я не гуру PowerShell, поэтому буду признателен за любую помощь.


person Beefcake    schedule 07.02.2018    source источник
comment
Despite the extension on GitHub showing as a Linux extension, not a MS one что это значит? вы также можете использовать ресурс DSC для шоколада, что, вероятно, намного лучше. также на какой из этих команд вызова он терпит неудачу?   -  person 4c74356b41    schedule 07.02.2018
comment
В шаблоне GitHub расширение отображалось как "publisher": "Microsoft.Azure.Extensions" вместо "publisher": "Microsoft.Compute". Да, я мог бы (и хотел бы...) использовать для этого DSC, но это было не то, что хотел конечный клиент.   -  person Beefcake    schedule 08.02.2018


Ответы (1)


Чтобы ответить на мой собственный вопрос, кажется, мне пришлось запустить winrm quickconfig, который включил следующий ключ в реестре:

"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\"
-Name 'LocalAccountTokenFilterPolicy' -Value '1' -PropertyType 'DWord'

Поэтому я изменил сценарий, включив в него следующие фрагменты до и после действий.

До:

# Enable LocalAccountTokenFilterPolicy
$LocalAccToken1 = Get-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\"
If(!($LocalAccToken1.GetValue("LocalAccountTokenFilterPolicy") -eq 1)) {
    New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System' `
    -Name 'LocalAccountTokenFilterPolicy' -Value '1' -PropertyType 'DWord' -Force
}

После (я убрал настройку «на всякий случай» гнусной активности, которая может быть связана с этим):

# Disable LocalAccountTokenFilterPolicy
$LocalAccToken2 = Get-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\"
If($LocalAccToken2.GetValue("LocalAccountTokenFilterPolicy") -eq 1) {
    Remove-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System' `
    -Name 'LocalAccountTokenFilterPolicy' -Force
    }

... Я надеюсь, что MS обновит свой шаблон.

person Beefcake    schedule 07.02.2018
comment
отправить PR для них - person 4c74356b41; 08.02.2018