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