Предыдущие:
1С и WSH и WMI. ОТ ТЕОРИИ К ПРАКТИКЕ. Часть I: //infostart.ru/public/165702/
1С и WSH и WMI. ОТ ТЕОРИИ К ПРАКТИКЕ. Часть II: //infostart.ru/public/166391/
Практическая реализация:
Обработка 1С:Системный Администратор (WSH&WMI): //infostart.ru/public/172189/
ТЕОРИЯ
Microsoft Windows Script Host (WSH) - сервер сценариев Windows.
Используется в качестве инструмента разработки и выполнения специальных сценариев для операционной системы Windows.
Сценарии WSH пишутся на специализированных языках: Microsoft Visual Basic Script Edition (VBScript) или Microsoft JScript.
Свойства и методы объектов Microsoft WSH доступны также в приложениях, способных выступить в роли OLE-клиента.
WSH позволяет работать с:
- Файловой системой;
- Ресурсами локальной сети;
- Реестром;
- Специальными папками и ярлыками Windows;
- Процессами. Запускать и контролировать их выполнение.
WSH позволяет взаимодействовать с Microsoft ActiveX:
- ActiveX Data Object (ADO) — Доступ к базам данных;
- Active Directory Service Interface (ADSI) — Службы каталогов;
- Windows Management Instrumentation (WMI) — Инструментарий управления Windows.
Подробно свойства и методы объектов MS Windows Script Host изложены в файле Automation.chm, доступном в ссылках на скачивание.
Windows Management Instrumentation (WMI) - инструментарий управления Windows.
WMI - это одна из базовых технологий для централизованного наблюдения и управления компьютерной инфраструктуры под управлением платформы Windows.
WMI – это расширенная и адаптированная компанией Microsoft реализация стандарта WBEM (WebBased Enterprise Management) компании DMTF Inc.
Основа WBEM - Common Information Model (CIM), реализующая объектно-ориентированный подход к представлению компонентов системы.
WMI позволяет работать с:
- Системой;
- Приложениями;
- Оборудованием;
- Сетями;
др. управляемыми компонентами.
Подробно о Windows Management Instrumentation (англ.): http://msdn.microsoft.com/en-us/library/windows/desktop/aa394572%28v=vs.85%29.aspx
ПРАКТИКА
// Корневые ключи реестра и их сокращения:
// HKEY_CURRENT_USER - HKCU
// HKEY_LOCAL_MACHINE - HKLM
// HKEY_CLASSES_ROOT - HKCR
// HKEY_USERS - HKEY_USERS
// HKEY_CURRENT_CONFIG - HKEY_CURRENT_CONFIG
Список процедур и функций:- ЗарегистрироватьФайлDLL() - Ф., позволяющая зарегистрировать файл типа DLL.- УстановленаПрограмма() - Ф., позволяющая проверить установлена/не установлена программа.- Computer_Programs_Product() - Ф., позволяющая получить информацию об установленных программах лок./уд. компьютере (WMI).- Computer_Programs_Registry() - Ф., позволяющая получить информацию об установленных программах лок./уд. компьютере (REGISTRY).- ИзменитьСтартовуюСтраницуInternetExplorer() - Ф., позволяющая изменить стартовую страницу Internet Explorer лок. компьютера.- RegRead() - Ф. чтения значения ключа или группы из системного реестра.- RegWrite() - Ф. создания в системном реестре ключа или группы.- RegDelete() - Ф. удаления ключа или группы из системного реестра.- Computer_RegistryInformation() - Ф., позволяющая получить информацию о реестре лок./уд. компьютера, в т.ч. дату установки Windows.- Computer_Description() - Ф., позволяющая записать в описание лок./уд. компьютера имя домена\пользователя, работающего на нем.- WindowsInfo() - Ф., позволяющая получить информацию об установленной Windows на лок. компьютере.- get_windows_key_via_reg_wmi.vbs. VBS-Срипт. Получение серийного номера Windows.
// Функция, позволяющая зарегистрировать файл типа DLL.
//
// ВАЖНО:
//
// Windows User Account Control (UAC) в ОС Vista и выше
// может помешать регистрации DLL.
//
// В этом случае необходимо:
// Вручную зарегистрировать фалй от имени "Администратора":
// "C:\Documents and Settings\All Users\1С_COMObject\X.DLL"
// Отключать UAC не рекомендуется.
//
// Возвращает:
// В случае успеха - COMОбъект.
// Иначе - Неопределено.
// Параметры:
// ИмяКаталогаDLL - Относительно переменной среды %ALLUSERSPROFILE%.
// ИмяФайлаDLL - Короткое имя файла DLL.
// ИмяМакетаDLL - Имя двоичного макета объекта, в котором находится файл DLL.
// ИмяCOMОбъекта - Имя создаваемого COMОбъекта.
//
&НаСервере
Функция ЗарегистрироватьФайлDLL(ИмяКаталогаDLL = "1С_COMObject" , ИмяФайлаDLL = "X.DLL", ИмяМакетаDLL = "XY", ИмяCOMОбъекта = "XYZ")
ЭтотОбъект = РеквизитФормыВЗначение("Объект");
ALLUSERSPROFILE = Неопределено;
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
WshSysEnv = WshShell.Environment("Process");
ALLUSERSPROFILE = WshSysEnv.Item("ALLUSERSPROFILE");
Исключение
Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
КаталогDLL = Новый Файл(ALLUSERSPROFILE + "\" + ИмяКаталогаDLL);
Если НЕ КаталогDLL.Существует() Тогда
Попытка
СоздатьКаталог(КаталогDLL.ПолноеИмя);
Исключение
Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
КонецЕсли;
ИмяФайлаDLL = КаталогDLL.ПолноеИмя + "\" + ИмяФайлаDLL;
ФайлDLL = Новый Файл(ИмяФайлаDLL);
Если НЕ ФайлDLL.Существует() Тогда
Попытка
МакетDLL = ЭтотОбъект.ПолучитьМакет(ИмяМакетаDLL);
МакетDLL.Записать(ФайлDLL.ПолноеИмя);
Исключение
Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
КонецЕсли;
Попытка
// "/s" - "тихий" режим REGsvr32: Окна сообщений не отображаются.
// 0 - Без окна WshShell.
// Истина - Дождаться завершения.
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run("REGsvr32 /s " + ИмяФайлаDLL, 0, Истина);
Исключение
//Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
ЗапуститьПриложение("REGsvr32 /s " + ИмяФайлаDLL, , Истина);
КонецПопытки;
// Проверка регистрации.
НовыйCOMОбъект = ПолучитьНовыйCOMОбъект(ИмяCOMОбъекта);
Возврат НовыйCOMОбъект;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьНовыйCOMОбъект(ИмяCOMОбъекта)
Попытка
НовыйCOMОбъект = Новый COMОбъект(ИмяCOMОбъекта);
Возврат НовыйCOMОбъект;
Исключение
Возврат Неопределено;
КонецПопытки;
Возврат Неопределено;
КонецФункции
// Функция, позволяющая проверить установлена/не установлена программа.
// Проверяет путь в системном реестре и существование запускаемого файла для программы,
// установку которой на компьютере необходимо проверить.
// Используется функция GetFileInfo, описанная в Части II.
//
&НаКлиентеНаСервереБезКонтекста
Функция УстановленаПрограмма(Программа = "LibreOffice")
Файл = Неопределено;
Если Программа = "LibreOffice" Тогда
Файл = RegRead("HKLM\Software\LibreOffice\LibreOffice\3.6\Path");
Иначе
// Файл = ...
КонецЕсли;
Если Файл = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
ПрограммаЗапуска = GetFileInfo(Файл);
Если НЕ ПрограммаЗапуска = Неопределено Тогда
// ... Дополнительная проверка при необходимости имени, размера, ....
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
// Функция, позволяющая получить информацию об установленных программах локальном/удаленном компьютере.
// Параметры:
// Computer - Имя компьютера.
// Возвращаемое значение:
// Таблица значений.
//
// Примечания:
// 1. Только программы, установленные с помощью Windows Installer.
// 2. Полнота информации в Windows 2000/XP/2003 ограничена.
// 3. Может не работать на 64-битных ОС.
// 4. Медленнее чтения из регистра.
//
// При запуске на на компьютере под управлением Windows Server 2003 возможна ошибка чтения данных,
// т.к. поставщик объекта Win32_Product по умолчанию в Windows Server 2003 не устаналивается.
// Установка:
// Панель управления - Установка и уделение программ - Установка компонентов Windows - Средства наблюдения и управления:
// Компонента: "Поставщик установщика Windows через WMI".
//
// Рекомендация:
// Перед применением проверить на компьютерах
// Windows Management Instrumentation (WMI):
// 1. Состояние служб.
// 2. Разрешение в брандмауэре.
// Подробности на странице: //infostart.ru/public/165702/
//
&НаСервереБезКонтекста
Функция Computer_Programs_Product(Computer = ".")
Win32_ProductInfo = Новый ТаблицаЗначений;
Win32_ProductInfo.Колонки.Добавить("Caption");
Win32_ProductInfo.Колонки.Добавить("Description");
Win32_ProductInfo.Колонки.Добавить("HelpLink");
Win32_ProductInfo.Колонки.Добавить("HelpTelephone");
Win32_ProductInfo.Колонки.Добавить("IdentifyingNumber");
Win32_ProductInfo.Колонки.Добавить("InstallDate");
Win32_ProductInfo.Колонки.Добавить("InstallLocation");
Win32_ProductInfo.Колонки.Добавить("InstallSource");
Win32_ProductInfo.Колонки.Добавить("InstallState");
Win32_ProductInfo.Колонки.Добавить("Language");
Win32_ProductInfo.Колонки.Добавить("LocalPackage");
Win32_ProductInfo.Колонки.Добавить("Name");
Win32_ProductInfo.Колонки.Добавить("PackageCache");
Win32_ProductInfo.Колонки.Добавить("PackageCode");
Win32_ProductInfo.Колонки.Добавить("PackageName");
Win32_ProductInfo.Колонки.Добавить("ProductID");
Win32_ProductInfo.Колонки.Добавить("RegCompany");
Win32_ProductInfo.Колонки.Добавить("RegOwner");
Win32_ProductInfo.Колонки.Добавить("SKUNumber");
Win32_ProductInfo.Колонки.Добавить("Transforms");
Win32_ProductInfo.Колонки.Добавить("URLInfoAbout");
Win32_ProductInfo.Колонки.Добавить("URLUpdateInfo");
Win32_ProductInfo.Колонки.Добавить("Vendor");
Win32_ProductInfo.Колонки.Добавить("Version");
Попытка
WinMGMT = ПолучитьCOMОбъект("winmgmts:\\" + Computer + "\root\cimv2");
Win32_Product = WinMGMT.ExecQuery("SELECT * FROM Win32_Product");
Для Каждого Product ИЗ Win32_Product Цикл
ProductInfo = Win32_ProductInfo.Добавить();
ProductInfo.Caption = ПолучитьЗначениеВПопытке(Product, "Caption");
ProductInfo.Description = ПолучитьЗначениеВПопытке(Product, "Description");
ProductInfo.HelpLink = ПолучитьЗначениеВПопытке(Product, "HelpLink");
ProductInfo.HelpTelephone = ПолучитьЗначениеВПопытке(Product, "HelpTelephone");
ProductInfo.IdentifyingNumber = ПолучитьЗначениеВПопытке(Product, "IdentifyingNumber");
InstallDate = ПолучитьЗначениеВПопытке(Product, "InstallDate");
Попытка
ProductInfo.InstallDate = Дата(Лев(InstallDate,8));
Исключение
ProductInfo.InstallDate = InstallDate;
КонецПопытки;
ProductInfo.InstallLocation = ПолучитьЗначениеВПопытке(Product, "InstallLocation");
ProductInfo.InstallSource = ПолучитьЗначениеВПопытке(Product, "InstallSource");
InstallState = ПолучитьЗначениеВПопытке(Product, "InstallState");
Если InstallState = -6 Тогда
ProductInfo.InstallState = "Bad Configuration";
ИначеЕсли InstallState = -2 Тогда
ProductInfo.InstallState = "Invalid Argument";
ИначеЕсли InstallState = -1 Тогда
ProductInfo.InstallState = "Unknown Package";
ИначеЕсли InstallState = 1 Тогда
ProductInfo.InstallState = "Advertised";
ИначеЕсли InstallState = 2 Тогда
ProductInfo.InstallState = "Absent";
ИначеЕсли InstallState = 5 Тогда
ProductInfo.InstallState = "Installed";
Иначе
ProductInfo.InstallState = "Invalid State";
КонецЕсли;
Language = ПолучитьЗначениеВПопытке(Product, "Language");
Если Language = "1033" Тогда
ProductInfo.Language = "Английский";
ИначеЕсли Language = "1049" Тогда
ProductInfo.Language = "Русский";
ИначеЕсли Language = "0" Тогда
ProductInfo.Language = "";
Иначе
ProductInfo.Language = Language;
КонецЕсли;
ProductInfo.LocalPackage = ПолучитьЗначениеВПопытке(Product, "LocalPackage");
ProductInfo.Name = ПолучитьЗначениеВПопытке(Product, "Name");
ProductInfo.PackageCache = ПолучитьЗначениеВПопытке(Product, "PackageCache");
ProductInfo.PackageCode = ПолучитьЗначениеВПопытке(Product, "PackageCode");
ProductInfo.PackageName = ПолучитьЗначениеВПопытке(Product, "PackageName");
ProductInfo.ProductID = ПолучитьЗначениеВПопытке(Product, "ProductID");
ProductInfo.RegCompany = ПолучитьЗначениеВПопытке(Product, "RegCompany");
ProductInfo.RegOwner = ПолучитьЗначениеВПопытке(Product, "RegOwner");
ProductInfo.SKUNumber = ПолучитьЗначениеВПопытке(Product, "SKUNumber");
ProductInfo.Transforms = ПолучитьЗначениеВПопытке(Product, "Transforms");
ProductInfo.URLInfoAbout = ПолучитьЗначениеВПопытке(Product, "URLInfoAbout");
ProductInfo.URLUpdateInfo = ПолучитьЗначениеВПопытке(Product, "URLUpdateInfo");
ProductInfo.Vendor = ПолучитьЗначениеВПопытке(Product, "Vendor");
ProductInfo.Version = ПолучитьЗначениеВПопытке(Product, "Version");
КонецЦикла;
Исключение
КонецПопытки;
Win32_ProductInfo.Сортировать("Name");
Возврат Win32_ProductInfo;
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьЗначениеВПопытке(хОбъект, хРеквизит)
Попытка
Возврат хОбъект[хРеквизит];
Исключение
Возврат Неопределено;
КонецПопытки;
Возврат Неопределено;
КонецФункции
// Функция, позволяющая получить информацию об установленных программах локальном/удаленном компьютере.
// Параметры:
// Computer - Имя компьютера.
// Возвращаемое значение:
// Таблица значений.
//
// Примечания:
// 1. Полнота информации [в сравнении с функцией Computer_Programs_Product()]:
// - Количество программ больше, т.к. нет ограничения на "Только программы, установленные с помощью Windows Installer".
// - Количество данных о конкретной программе меньше, но основная информация доступна.
// 2. Поддержка 64-битных ОС (из-за отсутствия 64-битной Windows - не проверялось).
// 3. Быстрее, чем при использовании WMI: ("SELECT * FROM Win32_Product").
//
// Рекомендация:
// Перед применением проверить на компьютерах
// Windows Management Instrumentation (WMI):
// 1. Состояние служб.
// 2. Разрешение в брандмауэре.
// Подробности на странице: //infostart.ru/public/165702/
//
&НаСервереБезКонтекста
Функция Computer_Programs_Registry(Computer = ".")
Win32_ProductInfo = Новый ТаблицаЗначений;
Win32_ProductInfo.Колонки.Добавить("Caption");
Win32_ProductInfo.Колонки.Добавить("Description");
Win32_ProductInfo.Колонки.Добавить("HelpLink");
Win32_ProductInfo.Колонки.Добавить("HelpTelephone");
Win32_ProductInfo.Колонки.Добавить("IdentifyingNumber");
Win32_ProductInfo.Колонки.Добавить("InstallDate");
Win32_ProductInfo.Колонки.Добавить("InstallLocation");
Win32_ProductInfo.Колонки.Добавить("InstallSource");
Win32_ProductInfo.Колонки.Добавить("InstallState");
Win32_ProductInfo.Колонки.Добавить("Language");
Win32_ProductInfo.Колонки.Добавить("LocalPackage");
Win32_ProductInfo.Колонки.Добавить("Name");
Win32_ProductInfo.Колонки.Добавить("PackageCache");
Win32_ProductInfo.Колонки.Добавить("PackageCode");
Win32_ProductInfo.Колонки.Добавить("PackageName");
Win32_ProductInfo.Колонки.Добавить("ProductID");
Win32_ProductInfo.Колонки.Добавить("RegCompany");
Win32_ProductInfo.Колонки.Добавить("RegOwner");
Win32_ProductInfo.Колонки.Добавить("SKUNumber");
Win32_ProductInfo.Колонки.Добавить("Transforms");
Win32_ProductInfo.Колонки.Добавить("URLInfoAbout");
Win32_ProductInfo.Колонки.Добавить("URLUpdateInfo");
Win32_ProductInfo.Колонки.Добавить("Vendor");
Win32_ProductInfo.Колонки.Добавить("Version");
Попытка
WinMGMT = ПолучитьCOMОбъект("winmgmts:\\" + Computer + "\root\default:StdRegProv");
HKCU = 2147483649;
HKLM = 2147483650;
HKCUPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\";
HKLMPath32 = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\";
HKLMPath64 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\";
Computer_Programs_Registry_Key(WinMGMT, HKCU, HKCUPath , Win32_ProductInfo);
Computer_Programs_Registry_Key(WinMGMT, HKLM, HKLMPath32, Win32_ProductInfo);
Computer_Programs_Registry_Key(WinMGMT, HKLM, HKLMPath64, Win32_ProductInfo);
Исключение
КонецПопытки;
Win32_ProductInfo.Сортировать("Name");
Возврат Win32_ProductInfo;
КонецФункции
&НаСервереБезКонтекста
Функция Computer_Programs_Registry_Key(WinMGMT, HK, HKPath, Win32_ProductInfo)
Win32_Product = Новый Массив;
Попытка
WinMGMT.EnumKey(HK, HKPath, Win32_Product);
Если Win32_Product = NULL Тогда
Возврат Неопределено;
КонецЕсли;
Исключение
Возврат Неопределено;
КонецПопытки;
Для Каждого Product ИЗ Win32_Product Цикл
Name = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "DisplayName");
Version = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "DisplayVersion");
ProductID = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "ProductGuid");
ParentName = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "ParentDisplayName");
NameString = Win32_ProductInfo.Найти(Name, "Name");
Если Name = Неопределено ИЛИ (НЕ NameString = Неопределено И NameString.Version = Version) Тогда
Продолжить;
КонецЕсли;
ProductInfo = Win32_ProductInfo.Добавить();
ProductInfo.Caption = Name;
ProductInfo.Description = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "Description");
Если НЕ ЗначениеЗаполнено(ProductInfo.Description) Тогда
ProductInfo.Description = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "Comments");
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ProductInfo.Description) Тогда
ProductInfo.Description = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "Readme");
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ProductInfo.Description) Тогда
ProductInfo.Description = Name;
КонецЕсли;
ProductInfo.HelpLink = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "HelpLink");
ProductInfo.HelpTelephone = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "HelpTelephone");
Если НЕ ЗначениеЗаполнено(ProductID) Тогда
IdentifyingNumber = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "UninstallString");
Если НЕ ЗначениеЗаполнено(IdentifyingNumber) Тогда
IdentifyingNumber = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "ModifyPath");
КонецЕсли;
Если ЗначениеЗаполнено(IdentifyingNumber) Тогда
ПозицияЛевойСкобки = Найти(IdentifyingNumber, "{");
ПозицияПравойСкобки = Найти(IdentifyingNumber, "}");
Если ПозицияЛевойСкобки > 0 И ПозицияПравойСкобки > 0 Тогда
ProductInfo.IdentifyingNumber = Сред(IdentifyingNumber, ПозицияЛевойСкобки, ПозицияПравойСкобки-ПозицияЛевойСкобки+1);
КонецЕсли;
КонецЕсли;
Иначе
ProductInfo.IdentifyingNumber = ProductID;
КонецЕсли;
InstallDate = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "InstallDate");
Попытка
ProductInfo.InstallDate = Дата(Лев(InstallDate,8));
Исключение
ProductInfo.InstallDate = InstallDate;
КонецПопытки;
ProductInfo.InstallLocation = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "InstallLocation");
ProductInfo.InstallSource = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "InstallSource");
ProductInfo.InstallState = Неопределено;
ProductInfo.Language = Неопределено;
ProductInfo.LocalPackage = Неопределено;
ProductInfo.Name = Name;
ProductInfo.PackageCache = Неопределено;
ProductInfo.PackageCode = Неопределено;
ProductInfo.PackageName = Неопределено;
ProductInfo.ProductID = ProductID;
ProductInfo.RegCompany = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "RegCompany");
ProductInfo.RegOwner = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "RegOwner");
ProductInfo.SKUNumber = Неопределено;
ProductInfo.Transforms = Неопределено;
ProductInfo.URLInfoAbout = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "URLInfoAbout");
ProductInfo.URLUpdateInfo = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "URLUpdateInfo");
ProductInfo.Vendor = ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKPath, Win32_ProductInfo, Product, "Publisher");
ProductInfo.Version = Version;
КонецЦикла;
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьЗначениеВПопытке_Key(WinMGMT, HK, HKXXPath, Win32_ProductInfo, Product, KeyName)
Попытка
Value = Неопределено;
WinMGMT.GetStringValue(HK, HKXXPath + Product, KeyName, Value);
Если Value = NULL ИЛИ СтрДлина(Value) = 0 Тогда
Возврат Неопределено;
Иначе
Возврат Value;
КонецЕсли;
Исключение
Возврат Неопределено;
КонецПопытки;
Возврат Неопределено;
КонецФункции
// Функция, позволяющая изменить стартовую страницу Internet Explorer локального компьютера.
// Для бухгалтеров - одно, для менеджеров - другое, ...
//
&НаКлиентеНаСервереБезКонтекста
Функция ИзменитьСтартовуюСтраницуInternetExplorer(НоваяСтраница)
ТекущаяСтраница = RegRead("HKCU\SOFTWARE\Microsoft\Internet Explorer\Main\Start Page");
Сообщить("Предыдущая стартовая страница IE: " + ТекущаяСтраница);
RegWrite("HKCU\SOFTWARE\Microsoft\Internet Explorer\Main\Start Page", НоваяСтраница, "REG_SZ");
ТекущаяСтраница = RegRead("HKCU\SOFTWARE\Microsoft\Internet Explorer\Main\Start Page");
Сообщить("Новая стартовая страница IE: " + ТекущаяСтраница);
КонецФункции
// Функция чтения значения ключа или группы из системного реестра.
// Возвращаемые значения типа:
// REG_SZ - строка.
// REG_DWORD - целое число.
// REG_BINARY - массив целый чисел
// REG_EXPAND_SZ - строка.
// REG_MULTI_SZ - массив строк.
&НаКлиентеНаСервереБезКонтекста
Функция RegRead(Путь = "HKLM\Software\Nokia\")
Значение = Неопределено;
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
Значение = WshShell.RegRead(Путь);
Исключение
КонецПопытки;
Возврат Значение;
КонецФункции
// Функция создания в системном реестре ключа или группы.
//
&НаКлиентеНаСервереБезКонтекста
Функция RegWrite(Путь = "HKLM\Software\Nokia\", Ключ = "Nokia_", Тип = "REG_SZ")
Значение = Неопределено;
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.RegWrite(Путь, Ключ, Тип);
Значение = WshShell.RegRead(Путь);
Исключение
КонецПопытки;
Если НЕ Значение = Неопределено Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
// Функция удаления ключа или группы из системного реестра.
//
&НаКлиентеНаСервереБезКонтекста
Функция RegDelete(Путь = Неопределено)
Если Путь = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Значение = Неопределено;
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.RegDelete(Путь);
Значение = WshShell.RegRead(Путь);
Исключение
КонецПопытки;
Если Значение = Неопределено Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
// Функция, позволяющая получить информацию о реестре локального/удаленного компьютера, в т.ч. дату установки Windows.
// Параметры:
// Computer - Имя компьютера.
// Возвращаемое значение:
// Структура.
//
// Рекомендация:
// Перед применением проверить на компьютерах
// Windows Management Instrumentation (WMI):
// 1. Состояние служб.
// 2. Разрешение в брандмауэре.
// Подробности на странице: //infostart.ru/public/165702/
//
&НаСервереБезКонтекста
Функция Computer_RegistryInformation(Computer = ".")
WinRegistryInfo = Новый Структура("Name,Description,InstallDate,CurrentSize,MaximumSize");
Попытка
WinMGMT = ПолучитьCOMОбъект("winmgmts:\\" + Computer + "\root\cimv2");
Win32_Registry = WinMGMT.ExecQuery("SELECT * FROM Win32_Registry");
Для Каждого Registry ИЗ Win32_Registry Цикл
WinRegistryInfo.Name = Registry.Name;
WinRegistryInfo.Description = Registry.Description;
// Дата установки Windows.
Попытка
WinRegistryInfo.InstallDate = Дата(Лев(Registry.InstallDate,14));
Исключение
КонецПопытки;
WinRegistryInfo.CurrentSize = Registry.CurrentSize;
WinRegistryInfo.MaximumSize = Registry.MaximumSize;
КонецЦикла;
Исключение
КонецПопытки;
Возврат WinRegistryInfo;
КонецФункции
// Функция, позволяющая записать в описание локального/удаленного компьютера имя домена\пользователя, работающего на нем.
// Описание компьютера отображается в качестве комментария в сетевом окружении.
// Изменяет параметр реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\srvcomment
// Применено WMI, т.к.:
// Изменения параметра в реестре требует перезагрузки компьютера для вступления в силу изменения,
// а при использовании WMI - изменения сразу вступают в силу.
//
// Параметры:
// Computer - Имя компьютера.
// Возвращаемое значение:
// Нет.
//
// Рекомендация:
// Перед применением проверить на компьютерах
// Windows Management Instrumentation (WMI):
// 1. Состояние служб.
// 2. Разрешение в брандмауэре.
// Подробности на странице: //infostart.ru/public/165702/
//
&НаСервереБезКонтекста
Функция Computer_Description(Computer = ".")
Попытка
WinMGMT = ПолучитьCOMОбъект("winmgmts:\\" + Computer + "\root\cimv2");
Win32_ComputerSystem = WinMGMT.ExecQuery("SELECT * FROM Win32_ComputerSystem");
Для Каждого ComputerSystem ИЗ Win32_ComputerSystem Цикл
NewDescription = ComputerSystem.UserName;
КонецЦикла;
Win32_OS = WinMGMT.InstancesOf("Win32_OperatingSystem");
Для Каждого OS ИЗ Win32_OS Цикл
OS.Description = NewDescription;
OS.Put_();
КонецЦикла;
Исключение
КонецПопытки;
КонецФункции
// Функция, позволяющая получить информацию об установленной Windows на локальном компьютере.
// Параметры:
// НЕТ.
// Возвращаемое значение:
// Структура.
//
&НаСервереБезКонтекста
Функция WindowsInfo()
Path = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion";
WINInfo = Новый Структура("BuildLab,CSDVersion,CurrentBuildNumber,CurrentVersion,ProductId,ProductName,RegisteredOrganization,RegisteredOwner,SystemRoot");
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
WINInfo.BuildLab = WshShell.RegRead(Path+"\BuildLab");
WINInfo.CSDVersion = WshShell.RegRead(Path+"\CSDVersion");
WINInfo.CurrentBuildNumber = WshShell.RegRead(Path+"\CurrentBuildNumber");
WINInfo.CurrentVersion = WshShell.RegRead(Path+"\CurrentVersion");
WINInfo.ProductId = WshShell.RegRead(Path+"\ProductId");
WINInfo.ProductName = WshShell.RegRead(Path+"\ProductName");
WINInfo.RegisteredOrganization = WshShell.RegRead(Path+"\RegisteredOrganization");
WINInfo.RegisteredOwner = WshShell.RegRead(Path+"\RegisteredOwner");
WINInfo.SystemRoot = WshShell.RegRead(Path+"\SystemRoot");
Исключение
КонецПопытки;
Возврат WINInfo;
КонецФункции
VBS-Срипт. Получение серийного номера Windows.
' Получение серийного номера Windows.
' Нижеследующий текст необходимо записать в файл, например с именем get_windows_key_via_reg_wmi.vbs
' Командная строка: get_windows_key_via_reg_wmi.vbs
' где - Имя удаленного компьютера.
' По-умолчанию (без параметра) скрипт выполняется относительно локального компьютера.
' Методы считывания: Утилита REG.EXE и WMI. Необходимые настройки.
' При считывании из реестра используется утилита REG.EXE.
' При этом на целевом (удаленном) компьютере должна быть запущена служба "Удаленный реестр".
' Если невозможно прочитать значение ключа удаленного реестра, используется WMI.
' При этом на целевом компьютере должен быть настроен WMI для удаленного доступа. см. подробности: //infostart.ru/public/172189
' Windows x32/x64. Особенности использования. Известные проблемы (условие: настройки произведены).
' Рекомендованный способ применения: Локально с правами администратора.
' Получение серийного номера удаленно.
' При удаленном получении серийного номера результат не всегда положительный.
' Исходный ПК x64, Целевой ПК x64 - результат положительный.
' Исходный ПК x64, Целевой ПК x32 - результат положительный.
' Исходный ПК x32, Целевой ПК x32 - результат положительный.
' Исходный ПК x32, Целевой ПК x64 - REG - отрицательный, WMI - положительный результат.
' Пояснение:
' При считывании из x32-Клиента в следствии отображения x64-Ключей на x32-Ключи происходит обращение к ветке реестра:
' HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\DigitalProductID
' Ключ DigitalProductID в разделе HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion по-умолчанию отсутствует.
' Примечание:
' Проверка существования компьютера в сети и его доступности не осуществляется.
On Error Resume Next
const HKLM = &H80000002
const KEY_QUERY_VALUE = &H1
Set WshShell = CreateObject("WScript.Shell")
Set WshArg = WScript.Arguments
If WshArg.Count > 0 Then
isLocalHost = FALSE
CompName = WshArg(0)
If CompName = "." Then
isLocalHost = TRUE
CompName = WshShell.ExpandEnvironmentStrings("%computername%")
End If
Else
isLocalHost = TRUE
CompName = WshShell.ExpandEnvironmentStrings("%computername%")
End If
PathFile = WshShell.CurrentDirectory & "\"
FileNameOUT = PathFile & "WinSKey_" & UCase(CompName) & ".txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objFileOUT = FSO.OpenTextFile(FileNameOUT, 2, TRUE)
objFileOUT.Write "PC: " & UCase(CompName) & vbNewLine
' Windows x64.
' При считывании из x32-Клиента в следствии отображения x64-Ключей на x32-Ключи происходит обращение к ветке реестра:
' HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\DigitalProductID
' Ключ DigitalProductID в разделе HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion по-умолчанию отсутствует.
If isLocalHost Then
' Извлечение данных из реестра на локальном компьютере.
sSubKeyName = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
ProductName = WshShell.RegRead(sSubKeyName & "ProductName")
DigitalProductId = WshShell.RegRead(sSubKeyName & "DigitalProductId")
WinProductSN = ConvertToKey(DigitalProductId)
objFileOUT.Write "OS: " & ProductName & vbNewLine
objFileOUT.Write "REG: " & WinProductSN & vbNewLine
Else
' На целевом (удаленном) компьютере должна быть запущена служба "Удаленный реестр".
sSubKeyName = "\\" & CompName & "\hklm\software\microsoft\windows nt\currentversion"
ProductName = RegReadKey(sSubKeyName, "ProductName", FSO, PathFile, "EXEC-RUN")
If NOT IsEmpty(ProductName) Then
objFileOUT.Write "OS: " & ProductName & vbNewLine
End If
DigitalProductId = RegReadKey(sSubKeyName, "DigitalProductID", FSO, PathFile, "EXEC-RUN")
If IsEmpty(DigitalProductId) Then
ReadRegistry = FALSE
objFileOUT.Write "REG: Error read " & sSubKeyName & "\DigitalProductId." & vbNewLine
Else
ReadRegistry = TRUE
DigitalProductId = StringToArrayByte(DigitalProductId)
WinProductSN = ConvertToKey(DigitalProductId)
objFileOUT.Write "REG: " & WinProductSN & vbNewLine
End If
' На целевом компьютере должна быть настроен WMI для удаленного доступа. см. подробности: //infostart.ru/public/172189
Set WinMGMT = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & CompName & "\root\default:StdRegProv")
If Err.Number <> 0 Then
objFileOUT.Write "WMI: Error= " & Err.Number & ": Error create WinMGMT. " & Err.Description & vbNewLine
objFileOUT.Close
WScript.Quit 1
End If
sSubKeyName = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
intRes = WinMGMT.CheckAccess(HKLM, sSubKeyName, KEY_QUERY_VALUE, bGranted)
If intRes <> 0 Then
objFileOUT.Write "WMI: Error=" & intRes & ": Failed verification of rights to read the " & sSubKeyName & vbNewLine
objFileOUT.Close
WScript.Quit 1
End If
If bGranted Then
If IsEmpty(ProductName) Then
intRes = WinMGMT.GetStringValue(HKLM, sSubKeyName, "ProductName", ProductName)
If IsEmpty(ProductName) Then
ProductName = "Windows-?"
Else
objFileOUT.Write "OS: " & ProductName & vbNewLine
End If
End If
intRes = WinMGMT.GetBinaryValue(HKLM, sSubKeyName, "DigitalProductId", DigitalProductId)
If intRes <> 0 Then
objFileOUT.Write "WMI: Error=" & intRes & ": Error read HKLM\" & sSubKeyName & "DigitalProductId." & vbNewLine
objFileOUT.Close
WScript.Quit 1
End If
Else
objFileOUT.Write "WMI: No permission to read the registry key HKLM\" & sSubKeyName & vbNewLine
objFileOUT.Close
WScript.Quit 1
End If
WinProductSN = ConvertToKey(DigitalProductId)
objFileOUT.Write "WMI: " & WinProductSN & vbNewLine
End If
objFileOUT.Close
WScript.Quit 0
Function RegReadKey(sSubKeyName, sKeyName, FSO, PathFile, RunExec)
Dim ObjExec, FileTMP, objFileTMP, intRes, sOUT, IsBreak, ArrOUT, LineKEY, ArrKEY, i, KeyVALUE
FileTMP = PathFile & sKeyName & ".txt"
If RunExec = "EXEC" Then
Set ObjExec = WshShell.Exec("%comspec% /c reg.exe query " & chr(34) & sSubKeyName & chr(34) & " /v " & sKeyName)
sOUT = NUL
IsBreak = FALSE
Do While TRUE ' Бесконечный цикл.
' Проверяем, достигнут ли конец выходного потока.
If (Not ObjExec.StdOut.AtEndOfStream) Then
' Считываем полностью выходной поток.
sOUT = sOUT + ObjExec.StdOut.ReadAll
End If
If IsBreak Then
Exit Do ' Выходим из цикла.
End If
' Проверяем, не завершилось ли выполнение команды.
If ObjExec.Status=1 Then
IsBreak = TRUE
Else
WScript.Sleep 100 ' Приостанавливаем сценарий на 0,1 сек.
End If
Loop
ArrOUT = Split(sOUT, vbCrLf) ' Формируем массив из выходного потока.
LineKEY = ArrOUT(2) ' Строка, содержащая ключ.
Else
intRes = WshShell.Run("%comspec% /c reg.exe query " & chr(34) & sSubKeyName & chr(34) & " /v " & sKeyName & " > " & chr(34) & FileTMP & chr(34), 0, TRUE)
If intRes = 0 Then
Set objFileTMP = FSO.OpenTextFile(FileTMP, 1, TRUE)
objFileTMP.SkipLine
objFileTMP.SkipLine
lineKEY = objFileTMP.ReadLine ' Строка, содержащая ключ.
objFileTMP.Close
FSO.DeleteFile(FileTMP)
Else
FSO.DeleteFile(FileTMP)
RegReadKey = NUL
End If
End If
lineKEY = Trim(Replace(lineKEY, " ", " "))
ArrKEY = Split(lineKEY)
KeyVALUE = NUL
For i = 4 TO UBound(ArrKEY)
KeyVALUE = KeyVALUE & " " & ArrKEY(i)
Next
KeyVALUE = Trim(KeyVALUE)
RegReadKey = KeyVALUE
End Function
Function StringToArrayByte(byVal regKeySTR)
Dim newElem, strArr(164)
ii = -1
For i = 1 To Len(regKeySTR) Step 2
ii = ii+1
newElem = Mid(regKeySTR, i, 2)
strArr(ii) = StrToByte(newElem)
Next
StringToArrayByte = strArr
End Function
Function StrToByte(byval text)
Dim S1, S2, Value1, Value2
S1 = Mid(text, 1, 1)
S2 = Mid(text, 2, 1)
If S1 = "A" Then Value1 = 160 End If
If S1 = "B" Then Value1 = 176 End If
If S1 = "C" Then Value1 = 192 End If
If S1 = "D" Then Value1 = 208 End If
If S1 = "E" Then Value1 = 224 End If
If S1 = "F" Then Value1 = 240 End If
If S1 = "0" OR S1 = "1" OR S1 = "2" OR S1 = "3" OR S1 = "4" OR S1 = "5" OR S1 = "6" OR S1 = "7" OR S1 = "8" OR S1 = "9" Then Value1 = CInt(S1)*16^1 End If
If S2 = "A" Then Value2 = 10 End If
If S2 = "B" Then Value2 = 11 End If
If S2 = "C" Then Value2 = 12 End If
If S2 = "D" Then Value2 = 13 End If
If S2 = "E" Then Value2 = 14 End If
If S2 = "F" Then Value2 = 15 End If
If S2 = "0" OR S2 = "1" OR S2 = "2" OR S2 = "3" OR S2 = "4" OR S2 = "5" OR S2 = "6" OR S2 = "7" OR S2 = "8" OR S2 = "9" Then Value2 = CInt(S2) End If
StrToByte = CByte(Value1+Value2)
End Function
Function ConvertToKey(regKeyHEX8)
Const KeyOffset = 52
isWin8 = (regKeyHEX8(66) \ 6) And 1
regKeyHEX8(66) = (regKeyHEX8(66) And &HF7) Or ((isWin8 And 2) * 4)
j = 24
Chars = "BCDFGHJKMPQRTVWXY2346789" '24 Symbol used in the product keys, Windows and Office.
Do
Cur = 0
y = 14
Do
Cur = Cur * 256
Cur = regKeyHEX8(y + KeyOffset) + Cur
regKeyHEX8(y + KeyOffset) = (Cur \ 24)
Cur = Cur Mod 24
y = y -1
Loop While y >= 0
j = j -1
winKeyOutput = Mid(Chars, Cur + 1, 1) & winKeyOutput
Last = Cur
Loop While j >= 0
If (isWin8 = 1) Then
keypart1 = Mid(winKeyOutput, 2, Last)
insert = "N"
winKeyOutput = Replace(winKeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
If Last = 0 Then winKeyOutput = insert & winKeyOutput
End If
a = Mid(winKeyOutput, 1, 5)
b = Mid(winKeyOutput, 6, 5)
c = Mid(winKeyOutput, 11, 5)
d = Mid(winKeyOutput, 16, 5)
e = Mid(winKeyOutput, 21, 5)
ConvertToKey = a & "-" & b & "-" & c & "-" & d & "-" & e
End Function
' Файл get_windows_key_via_reg_wmi.vbs доступен для скачивания в ссылках к обработке Системный администратор: //infostart.ru/public/172189
С уважением к сообществу МА!