Essa semana passei trabalho com uma conta de serviço (do domínio) que estava sendo bloqueda por tentativas inválidas de login. Esta mesma conta é utilizada na Application Pool de uma aplicação no IIS, para fins de autenticação integrada no acesso a banco e aplicações externas. Em paralelo as investigações para descobrir a origem do lockout, precisei alterar as credenciais utilizadas na Application Pool, pois a conta bloqueada estava causando um HTTP 503, consequentemente derrubando a aplicação. Solução? Powershell. Sempre ele.
# Conta de serviço antiga e nova (com senha) $oldAppPoolUser = "CONTOSO.COM\ServiceMyApp" $newAppPoolUser = "CONTOSO.COM\ServiceMyAppNew" $newAppPoolPassword = "mypassword" Import-Module "WebAdministration" # Percorre todas Application Pools do IIS foreach ($appPool in (Get-ChildItem –Path IIS:\AppPools)){ # Verifica as credenciais da Application Pool corrente $currentUser = Get-Item (Join-Path 'IIS:\AppPools' $appPool.name) | select -ExpandProperty processModel | select userName # Se a Application Pool utilizar o usuario 'antigo', faz a substituição e restarta a mesma if ($currentUser.userName -eq $oldAppPoolUser) { Set-ItemProperty (Join-Path 'IIS:\AppPools' $appPool.name) -Name ProcessModel -Value @{userName=$newAppPoolUser;password=$newAppPoolPassword;identitytype=3} Restart-WebAppPool $appPool.name } }
Indo além: Azure Resource Groups
Eu sou um grande fã do Azure Resource Manager, devido a versatilidade neste tipo de situação. Simplesmente listo todas VM´s pertencentes ao Resource Group (um agrupamento lógico) e aplico o script para cada umas delas. Assumindo que o nome do meu Resource Group seja AppPoolValidationRG:
-
- Opção1: Conectando pelo nome da VM (estando conectado via VPN ao Azure):
Login-AzureRmAccount $vmList = Get-AzureRMVM -ResourceGroup AppPoolValidationRG foreach ($vm in $vmList){ # TODO1: Conectar em Cada VM # TODO2: Veriricar se há IIS instalado/rodando # TODO3: Chamar FUNCTION que faz a troca do user da AppPool # Invoke-Command -ComputerName $ip.PrivateIpAddress -ScriptBlock {...} }
- Opção 2: Conectando pelo IP privado (estando conectado via VPN ao Azure):
Login-AzureRmAccount $vmList = Get-AzureRMVM -ResourceGroup AppPoolValidationRG foreach ($vm in $vmList){ $nics = Get-AzureRmNetworkInterface | where {$_.VirtualMachine.Id -eq $vm.Id} foreach ($nic in $nics){ $ip = Get-AzureRmNetworkInterfaceIpConfig -NetworkInterface $nic Write-Host $vm.name $ip.PrivateIpAddress # TODO1: Conectar em Cada VM # TODO2: Veriricar se há IIS instalado/rodando # TODO3: Chamar FUNCTION que faz a troca do user da AppPool # Invoke-Command -ComputerName $ip.PrivateIpAddress } }
- Opção 3: Conectando pelo IP público (caso exista para todas VM´s):
Login-AzureRmAccount $publicIPs = Get-AzureRmVM -ResourceGroupName ‘AppPoolValidationRG’ | Get-AzureRmPublicIpAddress foreach ($publicIP in $publicIPs){ # TODO1: Conectar em Cada VM # TODO2: Veriricar se há IIS instalado/rodando # TODO3: Chamar FUNCTION que faz a troca do user da AppPool # Invoke-Command -ComputerName $publicIP -ScriptBlock {...} }
[ ]´s