- Установка Windows 7 — Часть 18: Определение UUID компьютера
- Сценарий для определения UUID компьютера
- Тестирование сценария
- Заключение
- Как узнать и изменить UUID/GUID компьютера?
- uuid — атрибут
- Параметры
- Комментарии
- Системный номер раздела диска UUID / GUID / serial number
- В чем отличие UUID от GUID
- Как вытащить дату и время из GUID?
- Использование UUID / GUID как номера раздела (тома) на диске
Установка Windows 7 — Часть 18: Определение UUID компьютера
Посетителей: 6018 | Просмотров: 7761 (сегодня 0)
В части 16 этого цикла вы научились использовать базу данных MDT для настройки установки Windows 7 на основании UUID каждого целевого компьютера. В той же статье вы узнали, как использовать WMI для определения UUID в случае, если этот UUID не отображается в системном BIOS’е или в сопутствующей документации. Однако тот метод, который мы использовали, был несколько неряшлив, плюс на том компьютере, UUID которого вы собираетесь определять, уже должна быть установлена операционная система Windows.
Возникает вопрос: а можно ли использовать WMI для определения UUID компьютера, если на нем еще не установлена никакая операционная система? Ответ — да. Для этого нам сначала нужно удалить все те сценарии, которые мы насоздавали в двух предыдущих статьях. Затем нам нужно сделать образ Windows Preinstallation Environment (WinPE), добавить в этот образ сценарии и прожечь образ на CD. Потом этот CD можно использовать для загрузки чистого компьютера в WinPE и запуска сценария для определения UUID системы.
Именно этому посвящены эта и следующая статьи. Сначала, в данной статье, мы создадим небольшой сценарий, который просто отобразит UUID компьютера. А в следующей статье мы научимся создавать «инструменты»WinPE на CD, которые вы можете использовать для запуска сценария на пустой системе, на которой не установлена никакая операционная система, чтобы определить UUID системы. После использования WinPE-CD для запуска сценария на некотором количестве целевых компьютеров, вы можете внести эти UUID в базу данных MDT и установить образы Windows на каждый компьютер, что и требовалось.
Подсказка: Если вы новичок в написании сценариев для WMI, посмотрите мой 14-частный вводный цикл статей на WindowsNetworking.com под названием Управление сетями Windows с помощью сценариев.
Сценарий для определения UUID компьютера
В 16-й части нашего цикла мы видели, как можно определить UUID компьютера с помощью WMI:
- Мы начали со сценария DisplayClassProperties.vbs из 13-й части моего предыдущего цикла статей о сценариях, который отображает названия всех параметров класса WMI вместе со значениями этих параметров.
- Затем мы запустили WBEMTEST на компьютере, чтобы определить, что нам нужно внести в строку strWMIQuery = нашего сценария, чтобы он мог работать на определенном компьютере. Вот необходимые для этого шаги: (a) запустить WBEMTEST (b) подключиться к пространству имен root\cimv2 (c) щелкнуть Enum Instances (d) ввести Win32_ComputerSystemProduct (e) нажать OK. Затем результат WBEMTEST используется в качестве значения в вышеприведенной строке нашего сценария. Причем все это нужно делать вручную, так как копирование результата WBEMTEST в буфер обмена не поддерживается!
- После настройки сценария мы запускали его на компьютере, и в числе прочего в результате выводили UUID компьютера.
Все это выглядело, конечно, немного неряшливо: не слишком хорошо запускать WBEMTEST на компьютере или подстраивать сценарий каждый раз, когда его нужно запустить. И, кроме того, предпочтительнее было бы выводить только UUID компьютера, без кучи прочих вещей впридачу.
Вот как это сделать. Начнем с модифицированного сценария DisplayClassProperties.vbs, взятого из части 16 цикла статей:
Теперь для завершения того, что делает WBEMTEST, и возврата экземпляров класса Win32_ComputerSystemProduct, нам понадобится воспользоваться методом SWbemServices.InstancesOf объекта SWbemServices. Чтобы разобраться, как это нужно делать, я просто адаптировал следующий сценарий со страницы старого доброго Windows 2000 Scripting Guide (см. здесь):
Моя собственная версия вышеприведенного сценария выглядит так:
Зачем мне понадобилось, чтобы этот сценарий определял значения трех параметров — IdentifyingNumber, Name и Version? Потому что у класса Win32_ComputerSystemProduct есть три ключевых параметра, а именно (вы правильно угадали): IdentifyingNumber, Name и Version. Чтобы увидеть все это собственными глазами, обратитесь к документации по этому классу в MSDN. Помните, что ключевым параметром является параметр, обеспечивающий уникальный идентификатор экземпляра класса, а чтобы подключиться к экземпляру класса, вам нужно будет указать на конкретный экземпляр с помощью ключевого параметра класса. Ключевые параметры отмечены квалификатором «Key» в документации в MSDN; обратитесь к 13-й части моего предыдущего цикла статей о сценариях за более подробной информацией, касающейся ключевых параметров.
Теперь мне нужно соединить настроенный выше сценарий с другим моим сценарием — DisplayClassProperties.vbs — чтобы создать следующий новый сценарий, который я назвал UUID.vbs (обратите внимание на то, что я упростил этот сценарий, опустив определения переменных и обработку ошибок):
Смотрите: самое сложное здесь – убедиться в правильности строк в предложении strWMIQuery = . К примеру, предложение заканчивается на & chr(39), то есть одинарную кавычку, необходимую для правильного синтаксиса завершения предложения. Понадобилось немного потанцевать вокруг этого места, чтобы заставить его работать; тут мне помог такой трюк: временно вставить предложение Wscript.echo strWmiQuery сразу после предложения strWMIQuery = , чтобы я мог запустить сценарий и вывести содержимое строки, чтобы увидеть, правильный ли синтаксис у строки, после чего внес изменение и запускал сценарий снова, пока не получил правильный синтаксис.
Тестирование сценария
Давайте теперь посмотрим, работает ли наш сценарий, если запустить его из командной строки на компьютере, на котором установлена Windows XP (Рисунок 1):
Рисунок 1: Запуск UUID.vbs на компьютере с операционной системой
Давайте еще упростим запуск нашего сценария, создав дополнительный batch-файл под названием UUID.bat, который выглядит следующим образом:
Запуск сценария становится еще проще, а выходные данные — чище (Рисунок 2):
Рисунок 2: Запуск UUID.bat на компьютере с операционной системой
Заключение
Вот наш сценарий и готов, теперь нам нужно создать образ WinPE и включить наш сценарий в этот образ, чтобы мы могли запускать наш сценарий на пустых системах. В следующей статье этого цикла вы узнаете, как это сделать.
Как узнать и изменить UUID/GUID компьютера?
Каждый компьютер в сети должен иметь уникальный идентификатор UUID или GUID (в терминологии Microsoft). Он позволяет на базе этого ID аутентифицировать и активировать (при необходимости активации лицензий) компьютер.
Чтобы узнать GUID Windows компьютера, выполните команду Powershell на локальном компьютере:
get-wmiobject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID
get-wmiobject Win32_ComputerSystemProduct -computername PC_NAME | Select-Object -ExpandProperty UUID
Это же значение содержится в реестре в ветке HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid.
Однако, если речь идет о виртуальных машинах, Vmware технически позволяет создать (или клонировать) машины, сохраняя идентичный UUID, что конечно плохо. UUID основан на пути к конфигурационному файлу VM и он генерируется, когда вы первый раз включаете машину или ресетите (сбрасываете до изначального состояния) её. Эта информация записывается в SMBIOS файл конфигурации виртуальной машины — *.vmx. Файл текстовый, его можно редактировать в текстовом редакторе.
Нужная вам строка будет выглядеть примерно так: uuid.bios = «00 11 22 33 44 55 66 77-88 99 aa bb cc dd ee ff»
Соответственно, вы можете поменять значение на уникальное. Все действия необходимо производить на выключенной виртуальной машине.
Альтернативно, вы можете изменить UUID группы виртуальных машин, если они расположены на ESXi, через PowerCLI, используя скрипт на Powershell.
uuid — атрибут
Атрибут интерфейса [ UUID ] обозначает универсальный уникальный идентификатор (UUID), назначенный интерфейсу, который отличает его от других интерфейсов.
Параметры
Задает строку, состоящую из 8 шестнадцатеричных цифр, за которыми следует дефис, затем три группы из четырех шестнадцатеричных цифр, за которыми следует дефис, а затем 12 шестнадцатеричных цифр. Строку UUID можно заключать в кавычки, за исключением случаев, когда используется параметр компилятора MIDL /ОСФ.
Комментарии
Библиотека времени выполнения использует UUID интерфейса, который указывает атрибут [ UUID ] , чтобы обеспечить взаимодействие между клиентскими и серверными приложениями. Атрибут [ UUID ] может присутствовать в списке атрибутов интерфейса либо для интерфейса RPC, либо для COM-интерфейса.
Для интерфейса RPC список атрибутов интерфейса должен содержать либо атрибут [ UUID ] , либо [ локальный ] атрибут, и выбранный вариант должен быть ровно один раз. Если список содержит атрибут [ UUID ] , он также может включать [ атрибут Version ] .
Для COM-интерфейса (определяемого [ ] атрибутом интерфейса объектов) список атрибутов интерфейса должен включать атрибут [ UUID ] , но не может включать атрибут [ Version ] . Список для COM-интерфейса может включать [ локальный ] атрибут, даже если имеется атрибут [ UUID ] .
Microsoft RPC поддерживает расширение для устройства DCE IDL, позволяющее заключать UUID в двойные кавычки («» «). Форма в кавычках необходима для препроцессоров C-компилятора, которые преобразуют числа UUID в виде чисел с плавающей запятой.
Для обеспечения уникальности все значения UUID должны быть сформированы компьютером. Используйте служебную программу uuidgen для создания уникальных значений UUID.
Идентификатор UUID и номер версии интерфейса используются для определения возможности привязки клиента к серверу. Для привязки клиента к серверу UUID, указанный в интерфейсах клиента и сервера, должен быть одинаковым.
Обратите внимание, что интерфейс без атрибутов можно импортировать в базовый IDL-файл. Однако интерфейс должен содержать только типы данными без процедур. Если в интерфейсе содержится даже одна процедура, необходимо указать локальный или UUID.
Системный номер раздела диска UUID / GUID / serial number
На чистом диске нет никаких разделов и соответственно нет никаких номеров раздела.
В чем отличие UUID от GUID
UUID (Universally unique identifier «универсальный уникальный идентификатор») – UUID представляет собой 16-байтный (128-битный) номер. В каноническом представлении UUID изображают в виде числа в шестнадцатеричной системе счисления, разделённого дефисами на пять групп в формате 8-4-4-4-12.
GUID (Globally Unique Identifier) – это так называется у Microsoft – фактически это последняя реализация UUID (да, там были свои предыдущие версии и свой зоопарк).
Именно по этому актуальная разметка диска от Microsoft называется GPT (GUID Partition Table), читаем статью
В целом используется как идентификатор (в составе также закодирована дата и время создания):
- раздела на диске
- операционной системы
- загрузчика
- и прочая
Почему такая загадочная запись?
Очень удобно переводить двоичные числа в шестнадцатеричный формат (а в десятичный формат – очень неудобно).
Помним, что для половинки байта (4 бита):
Bin | Hex | Dec |
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | A | 10 |
1011 | B | 11 |
1100 | C | 12 |
1101 | D | 13 |
1110 | E | 14 |
1111 | F | 15 |
Т.е. один байт (8 бит) вида 11111111 легко представляется в виде FF = т.е. каждая половинка байта – это F (15 в десятичной системе).
Поэтому 128 бит легко превращаются в номер из 32 цифр в шестнадцатеричной системе счисления, 128/4 = 32
В номере UUID <8e44ac32-40e2-11ea-93a4-bff4e4da2abb> каждые два разряда фактически кодируют один байт.
Посмотрим на структуру номера
xxxxxxxx-xxxx-Mxxx–Nxxx-xxxxxxxxxxxx
4 бита M обозначают версию (“version”) UUID, а 1-3 старших бита N обозначают вариант (“variant”) UUID.
Первые две цифры кодируют дату и время создания.
Такое разделение на группы основано на структуре UUID:
Название поля | Длина (в байтах) | Длина (число 16-ричных цифр) | Содержимое |
---|---|---|---|
time_low | 4 | 8 | целое число, обозначающее младшие 32 бита времени |
time_mid | 2 | 4 | целое число, обозначающее средние 16 бит времени |
time_hi_and_version | 2 | 4 | 4 старших бита обозначают версию UUID, младшие биты обозначают старшие 12 бит времени |
clock_seq_hi_and_res clock_seq_low | 2 | 4 | 1-3 старших бита обозначают вариант UUID, остальные 13-15 бит обозначают clock sequence |
node | 6 | 12 | 48-битный идентификатор узла |
Как вытащить дату и время из GUID?
bdb62d89-cede-11e4-b12b-d4ae52b5e909
дата содержится в первых символах, bdb62d89-cede-11e4 которые нужно переставить задом наперед: 11e4-cede-bdb62d89
первый символ отбрасываем, убираем “лишние” знаки “-“(тире)
интервал в десятых долях микросекунд (HEX) получается равным: интервал 16= 1E4CEDEBDB62D89
переводим его в десятичный интервал интервал 10 = HexToDec(интервал 16);в результате получаем: интервал 10 = 136 461 344 788 852 105
находим интервал в секундах: интервал Сек = интервал 10 / 10 000 000;
Делаем сдвиг даты от 15.10.1582 г. + 13 646 134 478 + сдвиг на часовой пояс (Московское время) от “мирового времени” (GMT) = 20.03.2015 16:54:38
Использование UUID / GUID как номера раздела (тома) на диске
В LInux изначально используется UUID как системный номер раздела.
В Windows свой зоопарк.
Для FAT 32 – серийный номер из 4 байт = 8 символов в шестнадцатеричной системе
Для NTFS – серийный номер из 8 байт = 16 символов в шестнадцатеричной системе
Системный номер раздела записан непосредственно на диске – создается при форматировании диска. В серийном номер также закодирована дата и время создания раздела.
ВАЖНО: каждый диск “помнит” дату и время создания на нем конкретного раздела, это фактически записано в номере созданного раздела (при форматировании). Нужна шапочка из фольги…
Этот номер мы можем увидеть в свойствах раздела, который показывают программы для управления разделами.
Номер 4610e64f 10e64611 – 16 цифр в шестнадцатеричной системе
Правую половинку номера тома мы также можем увидеть через команду DIR в режиме командной строки
10e6-4611
Он используется Windows уже для регистрации (например раздела) – как устройства, подключенного к системе, вот на фото ниже (как это красиво называется – “точка монтирования” – Mount point).
Этот номер уже записан в недрах реестра – в отличии от серийного номера раздела, записанного в заголовке тома на диске.
Этот же номер мы можем увидеть в bcdedit – как номер основного диска С для работы системы
Видно, что номер GUID используется также для идентификации текущей операционной системы (т.е. в загрузчике явно указано, какую операционную систему нужно загружать и на каком диске она находится).
Вы можете сохранить ссылку на эту страницу себе на компьютер в виде htm файла