Каталог решений - 1С и Windows Script Host (WSH) и Windows Management Instrumentation (WMI). ОТ ТЕОРИИ К ПРАКТИКЕ. Часть III. Реестр

1С и Windows Script Host (WSH) и Windows Management Instrumentation (WMI). ОТ ТЕОРИИ К ПРАКТИКЕ. Часть III. Реестр

1С и Windows Script Host (WSH) и Windows Management Instrumentation (WMI). ОТ ТЕОРИИ К ПРАКТИКЕ. Часть III. Реестр

В наличии

Описание возможностей Windows Script Host и Windows Management Instrumentation.
Подборка "скриптовых" функций и процедур.
Работа с реестром.

Категория:

Описание


Предыдущие:

1С и WSH и WMI. ОТ ТЕОРИИ К ПРАКТИКЕ. Часть I: //sale.itcity.ru/public/165702/
1С и WSH и WMI. ОТ ТЕОРИИ К ПРАКТИКЕ. Часть II: //sale.itcity.ru/public/166391/

Практическая реализация:

Обработка 1С:Системный Администратор (WSH&WMI): //sale.itcity.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. Разрешение в брандмауэре.
// Подробности на странице: //sale.itcity.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. Разрешение в брандмауэре.
// Подробности на странице: //sale.itcity.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. Разрешение в брандмауэре.
// Подробности на странице: //sale.itcity.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. Разрешение в брандмауэре.
// Подробности на странице: //sale.itcity.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 для удаленного доступа. см. подробности: //sale.itcity.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 для удаленного доступа. см. подробности: //sale.itcity.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 доступен для скачивания в ссылках к обработке Системный администратор: //sale.itcity.ru/public/172189

МА! С уважением к сообществу МА!


has been added to your cart:
Оформление заказа