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

20.10.13

База данных - Администрирование СУБД

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

Предыдущие:

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

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


Windows Windows Script Host WSH Windows Management Instrumentation WMI VBS скрипт script реестр управление конфигурация системная информация удаленный компьютер

См. также

Создаем сценарии обслуживания SQL в Центре Контроля Качества 1С (Центр Администрирования)

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Данная статья научит вас, как создавать скрипты обслуживания MS SQL для Центра Контроля Качества (ЦКК) или Центра Администрирования (ЦА).

20.03.2024    514    Silenser    0    

3

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4531    dsdred    53    

72

Инструкция по установке Postgres для OLTP приложений и 1С. Часть 1. Базовая конфигурация

Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

В Postgres достаточно подробная документация, и, видимо, поэтому при инсталляции Postgres для 1С большинство параметров приходится выставлять самим. Параметров в Postgres много, а составить эффективную комбинацию не так просто. Все упрощается, если рассмотреть профиль нагрузки, например, 1С это прежде всего профиль OLTP нагрузки – так устроены его метаданные (объекты). Если сосредоточиться на оптимизации профиля OLTP, понимание Postgres сразу упростится.

15.02.2024    2332    1CUnlimited    14    

27

Очистка устаревших патчей в конфигурациях на базе БСП

Администрирование СУБД Бесплатно (free)

В этой короткой заметке хочется рассказать о быстром и удобном способе удаления расширений-патчей как в типовых конфигурациях, так и любых других, использующих БСП.

01.02.2024    1439    Sergey1CSpb    20    

15

Как запустить сервер лицензирования 1С на примере облачной платформы

Администрирование СУБД Россия Бесплатно (free)

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

25.01.2024    1661    doctor_it    15    

17

Обслуживание индексов MS SQL Server: как, когда и, главное, зачем?

Администрирование СУБД Бесплатно (free)

Казалось бы, базовое знание: «индексы надо обслуживать, чтобы запросы выполнялись быстро». Но обслуживание индексов выполняется долго и может мешать работе пользователей. Кроме того, в последнее время популярны разговоры о том, что индексы можно вообще не обслуживать – насколько это оправданно? Рассмотрим: на что влияет обслуживание индексов, когда надо и когда не надо его выполнять, и если надо – как это сделать так, чтобы никому не помешать?

16.01.2024    5809    Филин    13    

45

Резервное копирование журнала транзакций, наконец-то!

Архивирование (backup) Администрирование СУБД Россия Бесплатно (free)

Постараюсь объяснить, зачем нужно резервное копирование именно журнала транзакций, а не только базы данных, и почему я словно сбросил груз, настроив его - как, покажу, естественно. Кстати, будут скрипты T-SQL (с подробными комментариями) - отличный способ сделать администрирование базы более уютным.

04.12.2023    5869    n_mezentsev    15    

24

Дефрагментация индексов MS SQL для платформы 8.3.22

Инструменты администратора БД Администрирование СУБД Абонемент ($m)

Начиная с 8.3.22 фирма "1С" убрала блокировки БД на уровне страниц; если БД расположена в MS SQL, то стала возникать проблема при дефрагментации индексов с использованием команды ALTER INDEX REORGANIZE. Предлагаю модификацию известного скрипта, который позволяет обойти эту проблему.

1 стартмани

15.11.2023    2248    17    baturo    6    

13
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. TrinitronOTV 14 17.12.12 09:46 Сейчас в теме
тоже присоединюсь к сообществу: большое спасибо за данную публикацию, полезная информация
2. Поручик 4670 17.12.12 11:22 Сейчас в теме
(0) Ради трёх функций надо выделять в отдельную публикацию? Ты случайно не рейтинг с манями нарабатываешь?
4. StepByStep 3667 17.12.12 11:42 Сейчас в теме
(2) Поручик,
1-я часть - То, чем сам пользуюсь, что заинтересовало.
2-я часть - Тематическая - "Работа с Файловой системой".
3-я часть - Тематическая - "Работа с Реестром".
Надо было конечно сразу - по темам, было бы структурировано, что кажется более логично.
Но теперь - что сделано - то сделано.
21. amon_ra 54 08.05.13 12:39 Сейчас в теме
(4) спасибо за статью. Интересует функция ЗарегистрироватьФайлDLL() от имени администратора можно ли зарегать компоненту и что бы uac не появлялась?
22. StepByStep 3667 20.10.13 19:28 Сейчас в теме
(21) amon_ra,
Нативную внешнюю компоненту ?
3. Поручик 4670 17.12.12 11:23 Сейчас в теме
(0) Кстати, Automation.chm ты сам делал?
5. StepByStep 3667 17.12.12 11:47 Сейчас в теме
(3) Поручик,
Automation.chm взял готовым, где взял - теперь уже и не помню.
19. AlexO 135 21.02.13 15:12 Сейчас в теме
(5)
теперь уже и не помню.

я знаю, где взял :)
15. jmw 60 30.01.13 05:47 Сейчас в теме
(3) Порутчик, Automation.chm лежит на Скрипт кодинг-е
http://www.script-coding.com/
6. SeiOkami 3423 17.12.12 11:51 Сейчас в теме
StepByStep, Спасибо большое за интересные статьи, но всё же и вправду объединить их в одну статью было бы лучше. А то как то даже не прилично выглядит)
И всё же плюс =)
7. sstar90 17.12.12 12:35 Сейчас в теме
Спасибо за статью. Плюс
8. tvixeg 495 18.12.12 12:33 Сейчас в теме
интересует как с помощью WSH можно одновременно изменить размер управляемой формы и перетащить ее верх за границу экрана, сделав таким образом рабочий стол на весь экран. Встречал тут обработку которая может или перетащить за границу экрана, или изменить размер, а одновременно не может. Исходников там нет все зашито в dll.
9. StepByStep 3667 18.12.12 22:44 Сейчас в теме
(8) tvixeg,
WSH - Это сценарии команд, запускаемые интерпретаторами:
- Wscript.exe (если надо, выводит диалоговое окно);
- Cscript.exe (никаких диалоговых окон не выводит).
Wscript.exe - Используется по умолчанию в Windows.

WSH Имеет минимум возможностей по работе с окнами:
- Запустить программу в скрытом/минимальном/стандартном/текущим размером окна.
- Создать ярлык, запускающий программу в максимальном/стандартном/свернутым окном.
- Минимизировать/Отменить минимизацию окон открытых приложений.
- Определить количество открытых окон проводника.
- Расположить окна каскадом.
- Вывести окно сообщений.
- Активизировать окно интересующего приложения.
10. iceflash 4 20.12.12 02:34 Сейчас в теме
(8) tvixeg,
То, о чем вы говорите делается посредством вызовов Win API функций
11. mzelensky 53 20.12.12 07:54 Сейчас в теме
мне очень понравилось!
12. AlexBar 51 21.12.12 13:09 Сейчас в теме
Подскажите, как получить из сетевого окружения все компы сети? Доступные домены, IP и имена каждого компа, принадлежность к домену?
StepByStep; +1 Ответить
13. StepByStep 3667 23.12.12 12:31 Сейчас в теме
(12) AlexBar,
Данная часть "WSH. ОТ ТЕОРИИ К ПРАКТИКЕ" посвящена реестру.
Интересующая Вас функция "СетевоеОкружение()" добавлена мной сегодня в Часть I, в сборной, так сказать, "солянке".
Спасибо.
14. StepByStep 3667 29.12.12 16:48 Сейчас в теме
Добавлена новая Функция ЗарегистрироватьФайлDLL().
16. StepByStep 3667 30.01.13 11:44 Сейчас в теме
Добавлены 2 новых функции:
1. RegistryInformation:
Функция, позволяющая получить информацию о реестре локального/удаленного компьютера,
а также дату установки Windows.
2. DescriptionComputer:
Функция, позволяющая записать в описание компьютера (локального/удаленного) имя домена\пользователя, работающего на нем.
Описание компьютера отображается в качестве комментария в сетевом окружении.
17. StepByStep 3667 30.01.13 13:55 Сейчас в теме
Добавлена новая функция WindowsInfo:
Функция, позволяющая получить информацию об установленной Windows на локальном компьютере.
18. StepByStep 3667 21.02.13 13:42 Сейчас в теме
Добавлена новая функция Computer_Programs():
Функция, позволяющая получить информацию об установленных программах локальном/удаленном компьютере.
20. StepByStep 3667 26.02.13 09:39 Сейчас в теме
Функция Computer_Programs() заменена на Computer_Programs_Product().
Добавлена новая функция Computer_Programs_Registry().
Функции, позволяющие получить информацию об установленных программах локальном/удаленном компьютере.
23. StepByStep 3667 20.10.13 19:29 Сейчас в теме
20.10.2013.
Добавлен vbs-Срипт. Получение серийного номера Windows.
24. Ovrfox 14 16.12.15 15:02 Сейчас в теме
Привет всем
Использование * в запросах иногда приводит к существенным временным затратам
Например время исполнения запроса - несколько секунд, а именнованного несколько милисекунд
Win32_ComputerSystem = WinMGMT.ExecQuery("SELECT * FROM Win32_ComputerSystem");
        
        Для Каждого ComputerSystem ИЗ Win32_ComputerSystem Цикл
            NewDescription = ComputerSystem.UserName;
        КонецЦикла;

Win32_ComputerSystem = WinMGMT.ExecQuery("SELECT UserName FROM Win32_ComputerSystem");
        
        Для Каждого ComputerSystem ИЗ Win32_ComputerSystem Цикл
            NewDescription = ComputerSystem.UserName;
        КонецЦикла;
25. StepByStep 3667 24.12.15 17:25 Сейчас в теме
26. ybatiaev 58 14.05.18 15:52 Сейчас в теме
Добрый день!
Подскажите! Не могу понять!
Запускаю Процесс = WshShell.Exec(СтрокаКоманды), где в переменную СтрокаКоманды уже вписана строка создания архива.

В строке запуска присутствует путь создания архива и он является хранилищем(!). Он вида 192.168.0.100, 192.168.0.101 и т.п.
На некоторых терминалках это запускается(в домене), на некоторых нет(не в домене).
Ругается ан ошибки.
1. В отладчике поймал следующую "Ошибка при вызове метода контекста (GetOwner): Произошла исключительная ситуация (SWbemObjectEx): Not found". GetOwner делается для процесса.

2. если в командную строку включить параметр "/OUT Имя лог файла", то в лог выводится следующее
"Ошибка при выполнении файловой операции '\\192.168.0.100\1c\HANDS\ИмяБазы\ИмяБазы 2018-05-14 14-12-35.n1'. 1326(0x0000052E): Вход в систему не произведен: имя пользователя или пароль не опознаны." (с локальными путями нормально)

А, если запустить из под CMD эту строку запуска - всё отрабатывает "на ура"
Все папки хранилища доступны на этом терминальном сервере, все пути реальные и проверены. Доступ ВЕЗДЕ правильный.
Т.е. как бы из под меня с командной строки всё работает, а вот из под EXEC ругается на нелогин. Значит или запускается под другим пользователем. Под каким я не пойму.
Помогите пожалуйста разобраться.
Оставьте свое сообщение