В модуле политики стандартная windows метод initialize возвратил ошибку

Обновлено: 02.07.2024

Столкнулся с проблемой подключения к 7.7 из 8.3.
Есть список баз к которым поочерёдно подключаюсь для получения данных. Часть из них выдаёт ошибку при вызове метода контекста Initialize, часть же подключается без проблем. Подключение происходит на сервере. При "ручной" авторизации проблем не возникает.
Строка подключения:
Попытка
V7 = Новый COMОбъект("v77.Application"); // ("V1CEnterprise.Application"); // Новый COMОбъект("v77.Application");;
Исключение
V7 = Новый COMОбъект("V1CEnterprise.Application");
КонецПопытки;
Польз = ?(ЗначениеЗаполнено(ИсхТаблБаз.Пользователь)=Ложь,""," /N"+СокрЛП(ИсхТаблБаз.Пользователь));
Парол = ?(ЗначениеЗаполнено(ИсхТаблБаз.Пароль)=Ложь,""," /P"+СокрЛП(ИсхТаблБаз.Пароль));
Попытка
РезЗап = V7.Initialize(V7.RMTrade,"/D"+СокрЛП(ИсхТаблБаз.ПутьБазы)+Польз+Парол, "NO_SPLASH_SHOW"); // "NO_SPLASH_SHOW"); // ""); //,"NO_SPLASH_SHOW");
Исключение
Сообщить(ОписаниеОшибки());
РезЗап = 0;
КонецПопытки;

(1) Неверно указал секцию при создании темы. Вопрос по 8ке.

(2) Как раз таки на сервере "руками" и захожу в 7ку. Запуск 7ки и служба сервера 8ки под одной доменной учётной записью.

(2) Если база не зарегана, то вылезает окно с регистрацией и вроде висит до посинения.

Эти базы всегда не подключаются или только когда по очереди выполняешь подключение?

(6) Думаю так бы было запусти я авторизацию на клиенте.
(7) Не подключаются и поочерёдно, и по отдельности.

Попробовал перенести авторизацию на клиент. Всё работает, но сбор данных должен работать как фоновое задание.

+(10), и да, смотреть надо от пользователя, под которым крутится сервер приложения 8ки.

(10),(11) Всё запускаю под одной и той же учётной записью. В путях была разница как раз в последнем слешэ, но его добавление результата не принесло.

а если вместо "/D" попробовать "enterprise /D" лучше не станет?

CA Active Directory

CA Active Directory

Всем привет, как то давно я настроил для тестирования токенов центр сертификации, и забыл про него так как все работало как часы. Сегодня ко мне обратился сотрудник, с тем что у него в веб форме выпуска сертификатов выскакивает ошибка:

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-01

Я сразу подумал, что тупит служба CA и зашел на сервер ее перезапустить. Перезапуск не помог и я начал смотреть в просмотре событий ошибки, первое на что наткнулся это ошибка.

В модуле политики "Стандартная Windows" метод "Initialize" возвратил ошибку. Объект или свойство не найдено. Возвращен код состояния 0x80092004 (-2146885628). Политика служб сертификации Active Directory не содержит действительных шаблонов сертификатов.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-02

еще были получены ошибки.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-03

И зайдя в сам Центр сертификации в Шаблоны сертификатов выдавалась ошибка Не удалось загрузить информацию шаблона элемент не найден.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-04

Первый раз я такое видел, и начал читать тичнет. Вроде на рисовалось решение. Делаем резервную копию наших ключей и выданных сертификатов. Щелкаем правым кликом вашему CA и выбираем все задачи-Архивация ЦС.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-05

Откроется мастер архивации центра сертификации. Жмем Далее.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-06

Ставим галки Закрытый ключ и сертификат ЦС и База данных сертификатов. Указываем каталог для резервного копирования.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-07

Ставим пароль на архив.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-08

Готово. Все бэкап у нас есть.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-09

В итоге получится один файл.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-10

Теперь нам нужно удалить центр сертификации, идем в диспетчер серверов и нажимаете удалить роль.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-11

Видим, нашу роль

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-12

Снимаем галку и жмем далее.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-13

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-14

После удаления нажимаем закрыть и перезагружаемся.

Не найдены шаблоны сертификатов. Вы не имеете прав запрашивать сертификат на этом ЦС, или произошла ошибка доступа к Active Directory-15

date

01.03.2021

directory

Windows 10, Windows Server 2016, Скрипты

comments

комментарий 41

Любой бывалый Windows-админ периодически сталкивается с проблемами в работе службы WMI (Windows Management Instrumentation) и ее компонентах. Наличие проблем в подсистеме WMI является критичным с точки зрения нормального функционирования Windows, поэтому администратору необходимо проверить и восстановить работоспособность WMI. В этой статье мы опишем простую методику диагностирования и устранения неполадок службы WMI в Windows.

О наличии проблем с WMI может свидетельствовать широкий спектр ошибок:

  • Ошибки обработки WMI запросов в системных журналах и логах приложений ( 0x80041002 - WBEM_E_NOT_FOUND , WMI: Not Found , 0x80041010 WBEM_E_INVALID_CLASS );
  • Ошибки обработки GPO, связанные на WMI ( некорректная работа wmi фильтров групповых политик, и пр.);
  • WMI запросы выполняются очень медленно;
  • Ошибки при установке или работе агентов SCCM/SCOM;
  • Ошибки в работе скриптов (vbs или PowerShell), использующих пространство имен WMI (скрипты с Get-WmiObject и т.д.).

Диагностика проблем с WMI

В первую очередь нужно проверить служба Windows Management Instrumentation (Winmgmt) установлена в Windows и запущена. Вы можете проверить состояние службы в консоли services.msc или с помощью PowerShell:

Get-Service Winmgmt | Select DisplayName,Status,ServiceName

служба Windows Management Instrumentation (Winmgmt) работает

Если служба Winmgmt запущена, вы можете проверить работоспособность WMI, обратившись к ней с помощью простого WMI-запроса. Вы можете выполнить wmi запрос из командной строки или из PowerShell. Например, следующая команда выведет список установленных в Windows программ:

wmic product get name,version

Простейшая PowerShell команда для получения информации о версии и билда Windows 10 через WMI может выглядеть так:

powershell проверка работы wmi командой get-wmiobject

Как вы видите, служба WMI ответила на запрос корректно. Если при выполнении такого WMI-запроса Windows возвращает ошибку, скорее всего сервиса WMI работает некорректно, поврежден WMI репозиторий или есть какие-то другие проблемы.

ошибка Failed to initialize all required WMI classes

В моем случае, например, при открытии свойств WMI Control в консоли управления компьютером (compmgmt.msc) появлялась надпись:

Ранее для диагностики WMI существовала официальная утилита от Microsoft – WMIDiag.vbs (Microsoft WMI Diagnosis). WMIdiag это vbs скрипт, который проверяет различные подсистемы WMI и записывает собранную информацию в лог файлы (по умолчанию логи находятся в каталоге %TEMP% — C:\USERS\%USERNAME%\APPDATA\LOCAL\TEMP\). Получившийся отчет состоит из файлов, имена которых начинаются с WMIDIAG-V2.2 и включает в себя следующие типы фалов:

  • .log файлы содержат подробный отчет об активности и работе утилиты WMIDiag;
  • .txt файлы содержат итоговые отчеты о найденных ошибках, на которые стоит обратить внимание;
  • В .csv файлах содержится информация, нужная для долгосрочного анализа работы подсистемы WMI.

скрипт для исправления ошибок WMI WMIDiag.vbs

Совет. В 64 битных версиях Windows wmidiag нужно запускать так:

в противном случае появится ошибка:

WMIDiag It is not supported in Wow64

К сожалению, последняя версия WMIDiag 2.2 корректно работает только с версиями до Windows 8.1/Windows Server 2012 R2. На данный момент Microsoft даже удалила ссылку на загрузку WMIDiag из Download Center. Но при желании, этот скрипт можно найти в сети.

WMIDiag может дать подробную информацию по исправлению частных ошибок в WMI, но в большинстве случаев процесс это довольно трудоемкий и стоит потраченного времени только при решении инцидентов в критичных системах (как правило, на продуктивных серверах). Для массового сегмента рабочих станций пользователей сбросить и пересоздатьWMI репозиторий в Windows.

Исправление WMI репозитория, перерегистрация библиотек, перекомпиляция MOF файлов

В Windows 10/Windows Server 2016 вы можете проверить целостность репозитория WMI с помощью команды:

winmgmt-verifyrepository - проверка состояния репозитория wmi

Если команда возвращает, что база данных WMI находится в неконсистентном состоянии (INCONSISTENT или WMI repository verification failed), стоит попробовать выполнить “мягкое” исправление ошибок репозитория:

Данная команда выполняет проверку согласованности хранилища WMI и при обнаружении несогласованности перестраивает базу данных WMI.

Перезапустите службу WMI:

net stop Winmgmt
net start Winmgmt

Если стандартный способ исправления ошибок в WMI не помог, попробуйте следующий скрипт. Данный скрипт представляет собой ”мягкий” вариант восстановления службы WMI на компьютере (выполняется перерегистрация dll библиотек и службы WMI, перекомпилируются mof файлы). Данная процедура является безопасной и ее выполнение не должно привести к каким-либо новым проблемам с системой.

sc config winmgmt start= disabled
net stop winmgmt
cd %windir%\system32\wbem
for /f %s in ('dir /b *.dll') do regsvr32 /s %s
wmiprvse /regserver
sc config winmgmt start= auto
net start winmgmt
for /f %s in ('dir /b *.mof') do mofcomp %s
for /f %s in ('dir /b *.mfl') do mofcomp %s

На 64 битной версии Windows эти действия нужно также выполнить для каталога SysWOW64. Замените третью строку на

bat скрипт для перерегистрации компонентов wmi

Указанные команды можно выполнить путем простой вставки в окно командой строки, либо сохранить код в bat файле wmi_soft_repair.bat и запустить его с правами администратора. После окончания работы скрипта, перезагрузите Windows и проверьте работу WMI.

Сброс и пересоздание WMI репозитория (хранилища)

Если вам не помогли мягкие способ восстановления WMI, рассмотренные выше, придется перейти к более “жесткому” способу восстановления работоспособности службы WMI, заключающегося в пересоздании хранилищаWMI.

WMI репозиторий (хранилище) находится в каталоге %windir%\System32\Wbem\Repository и представляет собой базу данных, в которой содержится информация о метаданных и определениях WMI классов. В некоторых случаях WMI репозиторий может содержать статическую информацию классов. При повреждении репозитория WMI, в работе службы Windows Management Instrumentation (Winmgmt) могут наблюдаться ошибки вплоть до полной невозможности ее запустить.

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

Следующая команда выполнит сброс базы данных WMI к исходному состоянию (как после чистой установки Windows). Используйте эту команду для выполнения hard reset репозитория WMI, если параметре salvagerepository не исправил проблему:

Совет. На практике бывают случаи, когда пересоздание хранилища WMI приводит к проблемам со сторонним софтом. Это связано с тем, что все записи в базе WMI обнуляются (до состояния чистой системы). Такие программы скорее всего, придется переустанавливать в режиме восстановления.

Если обе команды ( Winmgmt /salvagerepository и Winmgmt /resetrepository ) не восстановили консистентное состояние базы WMI, попробуйте выполнить “жесткое” пересоздание базы WMI вручную таким скриптом:

sc config winmgmt start= disabled
net stop winmgmt
cd %windir%\system32\wbem
winmgmt /resetrepository
winmgmt /resyncperf
if exist Repos_bakup rd Repos_bakup /s /q
rename Repository Repos_bakup
regsvr32 /s %systemroot%\system32\scecli.dll
regsvr32 /s %systemroot%\system32\userenv.dll
for /f %s in ('dir /b *.dll') do regsvr32 /s %s
for /f %s in ('dir /b *.mof') do mofcomp %s
for /f %s in ('dir /b *.mfl') do mofcomp %s
sc config winmgmt start= auto
net start winmgmt
wmiprvse /regserver

сброс и восстановление хранилища wmi в windows 10

На 64 битной версии Windows нужно также перерегистрировать dll/exe и перекомпилировать mof файлы в каталоге %windir%\sysWOW64\wbem.

Данный скрипт полностью пересоздает хранилище WMI (старый репозиторий сохраняется в каталог Repos_bakup). После окончания работы скрипта нужно перезагрузить Windows. Затем протестируйте работу службы WMI простым запросом.

Проверьте состояние WMI репозитория. Если ошибки исправлены, команда winmgmt /verifyrepository должна вернуть:

WMI repository is consistent

В этой статье мы собрали основные способы, позволяющие продиагностировать и устранить неполадки службы и репозитория WMI.

>Alexander, Polevi
если не работает, смотрим документацию :)

Context menu handlers are a type of shell extension handler. Like all such handlers, they are in-process COM objects implemented as dynamic-link libraries (DLLs). Context menu handlers must export two interfaces in addition to IUnknown: IShellExtInit and IContextMenu.

The IShellExtInit interface is used by the shell to initialize the handler. When the shell calls IShellExtInit::Initialize, it passes in a data object with the object"s name and the PIDL of the folder that contains the file. The hRegKey parameter is not used with context menu handlers. The IShellExtInit::Initialize method must extract the file name from the data object and store the name and the folder"s PIDL for later use.

вывод напрашивается сам собой - сначала надо вызвать IShellExtInit::Initialize. пример из ActiveX\ShellExt должен помочь разобраться с параметрами. только предупреждаю сразу - сам я такого не делал :)

var
unk:IUnknown;
CM: IContextMenu;
SEI:IShellExtInit;
begin
// получаем IUnknown объекта
unk:=CreateComObject(IID_DrWeb);
//объект реализует IContextMenu и IShellExtInit, для получения указателей на них вызываем QueryInterface
CM :=unk as IContextMenu;
SEI:=unk as IShellExtInit;

pidlFolder я получил используя процедуру из JCL:

function PathToPidlBind(const FileName: string; out Folder: IShellFolder): PItemIdList;
var
Attr, Eaten: ULONG;
PathIdList: PItemIdList;
DesktopFolder: IShellFolder;
Path, ItemName: TUnicodePath;
begin
Result := nil;
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(ExtractFilePath(FileName)), -1, Path, MAX_PATH);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(ExtractFileName(FileName)), -1, ItemName, MAX_PATH);
if Succeeded(SHGetDesktopFolder(DesktopFolder)) then
begin
if Succeeded(DesktopFolder.ParseDisplayName(0, nil, Path, Eaten, PathIdList,
Attr)) then
begin
if Succeeded(DesktopFolder.BindToObject(PathIdList, nil, IID_IShellFolder,
Pointer(Folder))) then
begin
if FAILED(Folder.ParseDisplayName(0, nil, ItemName, Eaten, Result,
Attr)) then
begin
Folder := nil;
Result := DriveToPidlBind(FileName, Folder);
end;
end;
PidlFree(PathIdList);
end
else
( FileName, Folder ) Пытаюсь провести инициализацию: SEI.Initialize()
Parameters: (context menu or property sheet extension)
pidlFolder -- Specifies the parent folder
lpdobj -- Spefifies the set of items selected in that folder.
hkeyProgID -- Specifies the type of the focused item in the selection.

pidlFolder я получил используя процедуру из JCL:

function PathToPidlBind(const FileName: string; out Folder: IShellFolder): PItemIdList;
var
Attr, Eaten: ULONG;
PathIdList: PItemIdList;
DesktopFolder: IShellFolder;
Path, ItemName: TUnicodePath;
begin
Result := nil;
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(ExtractFilePath(FileName)), -1, Path, MAX_PATH);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(ExtractFileName(FileName)), -1, ItemName, MAX_PATH);
if Succeeded(SHGetDesktopFolder(DesktopFolder)) then
begin
if Succeeded(DesktopFolder.ParseDisplayName(0, nil, Path, Eaten, PathIdList,
Attr)) then
begin
if Succeeded(DesktopFolder.BindToObject(PathIdList, nil, IID_IShellFolder,
Pointer(Folder))) then
begin
if FAILED(Folder.ParseDisplayName(0, nil, ItemName, Eaten, Result,
Attr)) then
begin
Folder := nil;
Result := DriveToPidlBind(FileName, Folder);
end;
end;
PidlFree(PathIdList);
end
else
Result := DriveToPidlBind(FileName, Folder);
end;
end;

А вот как мне получить два остальных параметра?

procedure TForm1.Button2Click(Sender: TObject);
const
IID_IDataObject: TGUID = (D1:$0000010E;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
IID_DrWeb: TGUID = ""; // Dr.Web
var
Menu: Cardinal;
Unk: IUnknown;
CM: IContextMenu;
SEI: IShellExtInit;
ItemIdList: PItemIdList;
Folder: IShellFolder;
DataObject: IDataObject;
begin
Menu := CreatePopupMenu;
ItemIdList := PathToPidlBind(Edit1.Text, Folder);
if Assigned(ItemIdList) then
try
Unk := CreateComObject(IID_DrWeb);
CM := Unk as IContextMenu;
SEI := Unk as IShellExtInit;

Folder.GetUIObjectOf(Handle, 1, ItemIdList, IID_IDataObject, nil, Pointer(DataObject));

SEI.Initialize(nil, DataObject, 0);
CM.QueryContextMenu(Menu, 0, 0, $7FFF, CMF_NORMAL);
TrackPopupMenu(Menu, TPM_LEFTALIGN or TPM_LEFTBUTTON or
TPM_RIGHTBUTTON or TPM_RETURNCMD, 10, 10, 0, Handle, nil);
finally
( ItemIdList ) В общем, смог я победить эту задачу. Делаю так:

procedure TForm1.Button2Click(Sender: TObject);
const
IID_IDataObject: TGUID = (D1:$0000010E;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
IID_DrWeb: TGUID = ""; // Dr.Web
var
Menu: Cardinal;
Unk: IUnknown;
CM: IContextMenu;
SEI: IShellExtInit;
ItemIdList: PItemIdList;
Folder: IShellFolder;
DataObject: IDataObject;
begin
Menu := CreatePopupMenu;
ItemIdList := PathToPidlBind(Edit1.Text, Folder);
if Assigned(ItemIdList) then
try
Unk := CreateComObject(IID_DrWeb);
CM := Unk as IContextMenu;
SEI := Unk as IShellExtInit;

Folder.GetUIObjectOf(Handle, 1, ItemIdList, IID_IDataObject, nil, Pointer(DataObject));

SEI.Initialize(nil, DataObject, 0);
CM.QueryContextMenu(Menu, 0, 0, $7FFF, CMF_NORMAL);
TrackPopupMenu(Menu, TPM_LEFTALIGN or TPM_LEFTBUTTON or
TPM_RIGHTBUTTON or TPM_RETURNCMD, 10, 10, 0, Handle, nil);
finally
PidlFree(ItemIdList);
end;
DestroyMenu(Menu);
end;

OleCheck(SEI.Initialize(nil, DataObject, 0));
OleCheck(CM.QueryContextMenu(Menu, 0, 0, $7FFF, CMF_NORMAL));

и на строчке
( SEI.Initialize(nil, DataObject, 0 ) сделал я так:

OleCheck(Folder.GetUIObjectOf(Handle, 1, ItemIdList, IID_IDataObject, nil, Pointer(DataObject)));

упс. только сейчас заметил - почему у тебя первый параметр в Initialize nil? ты же собирался туда PIDL фолдера передавать?

кстати, MSDN дает какую-то противоречивую информацию о параметрах в Initialize.

(MSDN, январь 2000)
The hRegKey parameter is not used with context menu handlers

For context menu extensions, lpdobj identifies the selected file objects, hkeyProgID identifies the file class of the object with focus, and pidlFolder is not used.

For shortcut menu extensions, lpdobj identifies the selected file objects, hkeyProgID identifies the file class of the object with focus, and pidlFolder is either NULL (for file objects) or specifies the folder for which the shortcut menu is being requested (for folder background shortcut menus).

по идее, это должен быть ключ реестра типа HKEY_CLASSES_ROOT\.doc
сам ты получить его сможешь с помощью RegOpenKeyEx, если будешь знать, какой именно ключ нужен. потом надо будет его закрыть через RegCloseKey.

но у меня идеи кончились. может ты просто неправильно открываешь ключ? пробовал писать в реестр после того, как сам открыл ключ?

может Folder.GetUIObjectOf создает не совсем тот DataObject, который Windows передает в shell extension? можно попробовать перечислить форматы данных в них через EnumFormatEtc и сравнить.

>и что это за штука - DMEX Menu?
Это расширение контекстного меню, добавляющее подменю с полезными возможностями, например: открыть окно DOS в выбранной папке, скопировать имена выбранных файлов и ещё многое другое

С этим расширением вообще интересно получается. Я тут для интереса решил попробовать из JCL процедуру DisplayContextMenu (я в общем оттуда и черпал первые навыки). Так вот, контекстное меню, которое она показывает, не содержит пункта DMEX! А в проводнике есть. Вот это уже загадка.

Читайте также: