Назад | Перейти на главную страницу

PowerShell для сброса пароля учетной записи локального администратора. 5% отказов

Я отвечаю за изменение пароля учетной записи локального администратора в моей среде из 16 000 серверов; Я написал сценарий PowerShell, но это заняло слишком много времени, поэтому я добавил многопоточность, используя фабрику пространств выполнения PowerShell, чтобы разбить 16 000 на управляемые части.

Частота ошибок ~ 5% (~ 800 серверов); из них 75–100 являются явными ошибками, которые могут быть устранены (имя пользователя не найдено, доступ запрещен и т. д.), а 700–725 получают сообщение об ошибке «Сетевой путь не найден».

Однако проверка связи с серверами приводит к ответу, и инженеры серверов говорят мне, что они работают, у меня есть доступ, и что PowerShell и WMI работают и работают.

Понятия не имею, с чего начать устранение неполадок. Вот логика и код, которые я использую:

Я использую полные доменные имена, однако в моей компании серверы, как правило, указываются в DNS по-разному, а не в полных доменных именах, и эти два варианта не будут соответствовать друг другу. поэтому servera.production.active.directory не будет преобразован в servera.mycompany.com. Эта функция определяет допустимое полное доменное имя для подключения и установки пароля, возвращая либо действительное полное доменное имя, либо пустую строку:

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
}

Я пытаюсь выполнить изменение пароля, используя следующий код, встроенный в модуль и выполняемый для каждого сервера в списке, который мы обрабатываем (это длинная функция из-за кода фабрики пространства выполнения 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
}

Примечания: Test-Connection отфильтровывает серверы, которые в противном случае были бы недоступны; тайм-аут этой функции по умолчанию составляет ~ 180 секунд (3 минуты x 1600 серверов = слишком долго).

Этот код работает на 95% серверов и дает точные отчеты после года запуска этого скрипта. Однако серверные инженеры задаются вопросом, работает ли этот сценарий, потому что, когда я сообщаю о проблемах, они не видят, как и почему я получаю ошибку «сетевой путь не найден», когда все их тесты говорят, что он работает нормально.

Шаги по устранению неполадок на данный момент:

За последние 2 месяца я вручную устранял неполадки на каждом из 800 серверов и запускал сценарий около 15 раз только на отказавших серверах. Повторный запуск дает мне еще около 10-300 сбрасываемых паролей, но не улавливает их все, и это очень непоследовательно.

В трех случаях инженеры сервера сообщали об отсутствии проблем, я повторно запускал скрипт, и он сбрасывал их все без ошибок.

Итак, мои вопросы: что может быть причиной ошибки и на что мне обратить внимание, чтобы определить основную причину? Настройки на сервере? Настройки на моей рабочей станции?

Установка выглядит следующим образом: Windows XP Pro SP3. Серверы - Windows Server 2003 или Windows Server 2008 R2. Эти ошибки возникают в обеих серверных операционных системах.

Проверяли ли вы брандмауэр Windows или сторонний брандмауэр, чтобы убедиться, что он отключен или разрешает доступ к серверу, на котором запущен скрипт Powershell? Я бы также проверил маску подсети и убедился, что у вас включен «Общий доступ к файлам и принтерам» на отказавших клиентах.

Запустите WireShark на клиентском компьютере, регистрируйте весь сетевой трафик по мере выполнения сценария.

Это будет много данных, но, учитывая, что вы говорите о ручном запуске их на 800 серверах, это не будет намного хуже.

Ищите неудачное разрешение DNS, посмотрите на сравнение серверов, которые работали, и серверов, которые отказали.

WMI поддерживает ведение журнала, информацию об ошибках и отладочную информацию. Это может быть полезно на клиенте или на некоторых отказавших серверах: http://blogs.technet.com/b/askperf/archive/2008/03/04/wmi-debug-logging.aspx