понедельник, 13 января 2014 г.

Пустое имя компьютера Windows 7

После того, как в конце октября 2013 года Антивирус Касперского из-за ложного срабатывания удалил файл tcpip.sys, Лаборатория Касперсокого создала утилиту для устранения последствий ложного срабатывания. Эта утилита восстанавливала файл tcpip.sys и вносила изменения в реестр для исключения повторного срабатывания. После применения этой утилиты работа сети восстанавливалась, НО исправления, вносимые в реестр, содержали пустые значения параметров Domain, Hostname, NV Domain, NV Hostname в ветке [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]. Пустые значения этих параметров привели к тому, что имя компьютера не отображается в свойствах системы, а так же в списке арендованных адресов DHCP-сервера и списке узлов DNS-сервера.
Для исправления сложившейся ситуации можно обойти все компьютеры, у которых есть подобная проблема и исправить значания параметров реестра руками или, что более рационально, использовать следующий PowerShell-скрипт
#фильтр для включённых машин
Filter Where-Online
{
    $ping = new-object System.Net.NetworkInformation.Ping
    trap {Write-Verbose "ping error"; Continue}
    if ($ping.send($_).Status -eq "Success" ) { $_ }
}

function Registry-Fix {
    param ($strIP)
    #создание wmi объекта
    $reg = "\\"+$strIP+"\root\default:stdRegProv"
    $wmi = [wmiclass]$reg
    $hklm = 2147483650
    
    #Чтение имени компьютера
    $KeyRead = "SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName\"
    $PropRead = "ComputerName"
    $ComputerName = $wmi.GetStringValue($hklm,$KeyRead,$PropRead).sValue
    
    #Исправление занчений реестра
    $KeyWrite = "SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\"
    $ValueDomain = "domain.local"
    $ValueHostname = $ComputerName
    $wmi.SetStringValue($hklm,$KeyWrite,"Domain",$ValueDomain)
    $wmi.SetStringValue($hklm,$KeyWrite,"Hostname",$ValueHostname)
    $wmi.SetStringValue($hklm,$KeyWrite,"NV Domain",$ValueDomain)
    $wmi.SetStringValue($hklm,$KeyWrite,"NV Hostname",$ValueHostname)    
    
}
#Имя DHCP-сервера
$DHCP_SERVER = "dhcp"
#Запрос всех арендованных адресов
$ShowLeases = "netsh dhcp server \\$DHCP_SERVER scope 192.168.0.0 show clients 1"
$AllLeases = Invoke-Expression $ShowLeases
$LeaseClients = @()

#Выделение строк и выбор необходимых IP-адресов
for($i=8;$i -lt $AllLeases.Length-4;$i++)
{
    $line = [regex]::split($AllLeases[$i],"\s{2,}")
    $IP = $line[0]
    $Name = $line[5]
    If ($Name.Length -eq 0) {$LeaseClients += $IP}
}

#Перебор компьютеров
foreach ($comp in $LeaseClients | Where-Online) {Registry-Fix $comp}
Если при выполнении запроса арендованных адресов появляется сообщение о том, что такая команда не найдена, то необходимо скачать Средства удалённого администрирования сервера или выполнить скрипт на том компьютере, на котором установлен DHCP-сервер.

Комментариев нет:

Отправить комментарий