Я отвечаю за изменение пароля учетной записи локального администратора в моей среде из 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