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 реестр управление конфигурация системная информация удаленный компьютер

См. также

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

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

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

11.03.2024    3562    dsdred    48    

66

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

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

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

15.02.2024    2271    1CUnlimited    14    

27

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

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

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

01.02.2024    1306    Sergey1CSpb    20    

15

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

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

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

25.01.2024    1542    doctor_it    15    

17

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

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

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

16.01.2024    5510    Филин    11    

44

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

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

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

04.12.2023    5702    n_mezentsev    15    

23

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

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

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

1 стартмани

15.11.2023    2080    17    baturo    6    

12

Мигрируем с MS SQL на PostgreSQL

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

Переход с MS SQL на PostgreSQL сопряжен с рисками для бизнеса и неизбежно вызывает множество вопросов. Статья посвящена тому, как заранее подготовиться к предстоящей миграции, провести нагрузочное тестирование, выявить возможные проблемы перехода и провести необходимую оптимизацию.

13.11.2023    10376    ivanov660    31    

73
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. TrinitronOTV 14 17.12.12 09:46 Сейчас в теме
тоже присоединюсь к сообществу: большое спасибо за данную публикацию, полезная информация
2. Поручик 4670 17.12.12 11:22 Сейчас в теме
(0) Ради трёх функций надо выделять в отдельную публикацию? Ты случайно не рейтинг с манями нарабатываешь?
4. StepByStep 3666 17.12.12 11:42 Сейчас в теме
(2) Поручик,
1-я часть - То, чем сам пользуюсь, что заинтересовало.
2-я часть - Тематическая - "Работа с Файловой системой".
3-я часть - Тематическая - "Работа с Реестром".
Надо было конечно сразу - по темам, было бы структурировано, что кажется более логично.
Но теперь - что сделано - то сделано.
21. amon_ra 54 08.05.13 12:39 Сейчас в теме
(4) спасибо за статью. Интересует функция ЗарегистрироватьФайлDLL() от имени администратора можно ли зарегать компоненту и что бы uac не появлялась?
22. StepByStep 3666 20.10.13 19:28 Сейчас в теме
(21) amon_ra,
Нативную внешнюю компоненту ?
3. Поручик 4670 17.12.12 11:23 Сейчас в теме
(0) Кстати, Automation.chm ты сам делал?
5. StepByStep 3666 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 3417 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 3666 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 3666 23.12.12 12:31 Сейчас в теме
(12) AlexBar,
Данная часть "WSH. ОТ ТЕОРИИ К ПРАКТИКЕ" посвящена реестру.
Интересующая Вас функция "СетевоеОкружение()" добавлена мной сегодня в Часть I, в сборной, так сказать, "солянке".
Спасибо.
14. StepByStep 3666 29.12.12 16:48 Сейчас в теме
Добавлена новая Функция ЗарегистрироватьФайлDLL().
16. StepByStep 3666 30.01.13 11:44 Сейчас в теме
Добавлены 2 новых функции:
1. RegistryInformation:
Функция, позволяющая получить информацию о реестре локального/удаленного компьютера,
а также дату установки Windows.
2. DescriptionComputer:
Функция, позволяющая записать в описание компьютера (локального/удаленного) имя домена\пользователя, работающего на нем.
Описание компьютера отображается в качестве комментария в сетевом окружении.
17. StepByStep 3666 30.01.13 13:55 Сейчас в теме
Добавлена новая функция WindowsInfo:
Функция, позволяющая получить информацию об установленной Windows на локальном компьютере.
18. StepByStep 3666 21.02.13 13:42 Сейчас в теме
Добавлена новая функция Computer_Programs():
Функция, позволяющая получить информацию об установленных программах локальном/удаленном компьютере.
20. StepByStep 3666 26.02.13 09:39 Сейчас в теме
Функция Computer_Programs() заменена на Computer_Programs_Product().
Добавлена новая функция Computer_Programs_Registry().
Функции, позволяющие получить информацию об установленных программах локальном/удаленном компьютере.
23. StepByStep 3666 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 3666 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 ругается на нелогин. Значит или запускается под другим пользователем. Под каким я не пойму.
Помогите пожалуйста разобраться.
Оставьте свое сообщение