PowerShell para redefinir a senha da conta de administrador local. 5% de falhas

2

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.

    
por Tim Wilde 03.05.2013 / 22:33

2 respostas

0

Execute o WireShark no computador cliente, registre todo o tráfego da rede enquanto o script é executado.

Isso vai ser um monte de dados, mas dado que você está falando sobre executá-lo manualmente em 800 servidores, não vai ser muito pior do que isso.

Procure uma resolução de DNS com falha, analise a comparação entre os servidores que funcionaram e os servidores que falharam.

O WMI suporta registro, erros e informações de depuração. Pode ser útil no cliente ou em alguns dos servidores com falha: link

    
por 04.05.2013 / 04:10
0

Você verificou o Firewall do Windows ou o software de firewall de terceiros para confirmar se está desativado ou se permite o acesso ao servidor que está executando o script Powershell? Eu também verificaria a máscara de sub-rede e verificaria se você tem "Compartilhamento de arquivos e impressoras" ativado nos clientes com falha.

    
por 03.05.2013 / 23:22