Eu tenho a responsabilidade de alterar a senha da conta de administrador local no meu ambiente de 16.000 servidores; Eu escrevi um script do PowerShell, mas demorou muito, então adicionei o multi-threading usando a fábrica powerspace da powershell para dividir as 16.000 em partes gerenciáveis.
Existe uma taxa de erro de ~ 5% (~ 800 servidores); destes, 75-100 são erros claros que podem ser problemáticos (nome de usuário não encontrado, acesso negado, etc.) e 700-725 obtêm a mensagem de erro "O caminho de rede não foi encontrado".
No entanto, o ping nos servidores recebe uma resposta e os engenheiros de servidor informam que estão operacionais, que eu tenho acesso e que o PowerShell e o WMI estão em execução e funcionando.
Não tenho ideia de onde começar a solução de problemas. Aqui está a lógica e o código que estou usando:
Eu uso FQDNs, no entanto, minha empresa tende a ter servidores listados de maneira diferente no DNS para seu FQDN, e as duas opções não serão resolvidas entre si. então servera.production.active.directory não será resolvido para servera.mycompany.com. Essa função determina um FQDN válido para conectar e definir a senha, retornando um FQDN válido ou uma string vazia:
function get-validfqdn([string]$server, [string]$domain){
$fqdn = $server + "." + (get_FQDN $domain)
$altdn = $server + ".mycompany.com"
if(Test-Connection -count 1 -computer $fqdn -quiet -TimeToLive 80){
$valid = $fqdn
}
elseif{
$valid = $altdn
}else{
$valid = ""
return $valid
}
Eu tento executar a alteração de senha usando o código a seguir, incorporado em um módulo e executado para cada servidor na lista que estamos processando (essa é uma função longa devido ao código de fábrica do espaço de execução do PowerShell).
function Set-ServerPass([string]$filepath){
$servers = Import-CSV $filepath
$results = @()
foreach($server in $servers){
$svr = $server.Server
$password = $server.Password
$domain = $server.domain
$fqdn = get-validfqdn $svr $domain
if ($fqdn -ne ""){
Try{
$admin = [adsi]("WinNT://$fqdn/Administrator, user")
$admin.psbase.invoke("SetPassword", "$password")
$result.Error_Code = "0"
$result.Error_Msg = "The operation was sucessful"
}Catch{
$error_msg = Trim_ExceptionMessage $_.exception.Message
$result.Error_Code = "1"
$result.Error_Msg = $error_msg
$results += $result
}
}else{
$result.Error_Code = "51"
$result.Error_Msg = "The remote computer is not available"
}
}
return $results
}
Notas: O Test-Connection filtra servidores que, de outra forma, estariam indisponíveis; um tempo limite nesta função padrão é de ~ 180 segundos (3 minutos x 1600 servidores = muito tempo).
Este código funciona em 95% dos servidores e reporta com precisão após um ano de execução deste script. No entanto, engenheiros de servidores estão começando a questionar se esse script funciona porque quando eu relato problemas eles não estão vendo como ou por que eu recebo o erro "o caminho da rede não foi encontrado" quando todos os testes dizem que está funcionando bem. >
Resolução de problemas até agora:
- Executar em computador diferente
- Executar como administrador diferente
- Executar em diferentes momentos do dia - isso para evitar que a possível atividade do servidor interrompa o script (aplicação de patches, reinicializações, etc.)
Nos últimos 2 meses, criei problemas manualmente em cada um dos 800 servidores e executei o script cerca de 15 vezes apenas nos servidores com falha. Re-running me faz cerca de 10 a 300 senhas sendo redefinidas, mas não pega todas elas, e é muito inconsistente.
Em 3 ocasiões, os engenheiros de servidor não relataram problemas, eu re-executei o script e ele redefiniu todos eles sem erros.
Então, minhas perguntas são: o que poderia estar causando o erro, e o que devo analisar para determinar a causa raiz? Configurações no servidor? Configurações na minha estação de trabalho?
A configuração é a seguinte: Windows XP Pro SP3. Servidores são o Windows Server 2003 ou o Windows Server 2008 R2. Esses erros ocorrem nos dois sistemas operacionais do servidor.