Почему для изменения имени компьютера требуется перезагрузка в Windows?

30

Я понимаю, что для изменения имени хоста / имени компьютера на компьютере под управлением Windows (клиент или сервер) требуется перезагрузка. Я понимаю, что после изменения имени компьютера имя ожидающего компьютера сохраняется в системном реестре и применяется при следующей загрузке. Я не смог найти много технической документации о том, ПОЧЕМУ это требовалось.

Может ли кто-нибудь указать мне правильное направление на технические проблемы, связанные с тем, почему изменение имени хоста не завершено без перезагрузки системы?

Амир Дин
источник
1
Добавил комментарий к принятому ответу со ссылкой на статью MSDN о том, почему требуется перезагрузка.
Амир Дин
Я бы не сказал, что связанная статья объясняет, почему требуется перезагрузка. В конце концов, если бы это было просто вопросом копирования его в другое место, то команда для изменения имени могла бы пойти дальше и скопировать его. Ключевое предложение в принятом ответе: «Многие службы и приложения Windows, как написанные Microsoft, так и сторонними разработчиками, которые используют имя хоста системы, обычно читают его только один раз при запуске и никогда не читают его снова».
ToolmakerSteve

Ответы:

56

Вам не нужно перезагружать компьютер сразу после переименования устройства ... просто не ожидайте, что все службы и функции получат новое имя.

Такие вещи, как системные переменные среды, читаются один раз при запуске системы. Если вы измените эти переменные, различные компоненты Windows не будут использовать их до тех пор, пока они не будут перезапущены. Некоторые из этих компонентов настолько тесно интегрированы с ОС, что вы могли бы перезапустить всю ОС.

Многие службы и приложения Windows, как написанные Microsoft, так и сторонними разработчиками, которые используют имя хоста системы, обычно читают его только один раз при запуске и никогда не читают его снова.

Я знаю, что если бы я писал приложение, которое считывало бы имя хоста компьютера, с моей стороны было бы довольно глупо периодически запрашивать его на случай, если оно изменится.

В операционной системе, такой как Linux, вы видите то же самое. Вы можете изменить имя хоста без перезагрузки, но вам нужно перезапустить некоторые самые базовые компоненты системы, чтобы они могли выбрать новое имя. Linux более модульный, чем Windows, хотя Windows прошла долгий путь с точки зрения модульности.

Один из способов определить, ожидает ли система Windows переименования компьютера, - это проверить реестр. Если содержание

HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName

а также

HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName

это не то же самое, это означает, что в системе есть ожидающая операция переименования, которая завершится при следующей перезагрузке системы.

Райан Райс
источник
10
Спасибо за совет Райан. Я посмотрел код для System.Environment.MachineName (используя dotnetpeek). Он использует функцию GetComputerName в Kernel32.dll, которая: «Получает имя NetBIOS локального компьютера. Это имя устанавливается при запуске системы, когда система считывает его из реестра». ( msdn.microsoft.com/en-us/library/windows/desktop/… ). Другими словами, вы правы, его просто кэшируют при запуске. Просто хотел документацию, чтобы поддержать это. Спасибо.
Амир Дин