Нужен тест на создание моникеров в Windows и wine. intuit.ru: Формат строки WMI-моникера похож на стандартный путь к объектам WMI. При этом моникеры могут состоять из трех частей: * обязательный префикс "WinMgmts:"; * необязательные параметры, определяющие настройки безопасности при работе с WMI ; * необязательный путь к нужному объекту WMI.
Страница, посвящённая vbs-сценариям для работы с WMI: http://www.script-coding.info/WMI_Processes.html Простой сценарий, запускающий блокнот. Работает на win2k3, в wine возвращает ошибку из-за невозможности создать моникер. On Error Resume Next Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process") If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If Res = objClass.Create("notepad.exe", Null, Null, PID) If Res <> 0 Then WScript.Echo "Код ошибки: " & Res End If
Из трейса по +ole: trace:ole:MkParseDisplayName (0x133ad0, L"winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\CIMV2:Win32_Process", 0x32ee dc, 0x32eee8) warn:ole:CLSIDFromProgID couldn't open key for ProgID L"winmgmts" В коде: strcpyW( buf, progid ); strcatW( buf, clsidW ); if (RegOpenKeyW(HKEY_CLASSES_ROOT,buf,&xhkey)) { HeapFree(GetProcessHeap(),0,buf); WARN("couldn't open key for ProgID %s\n", debugstr_w(progid)); return CO_E_CLASSSTRING; }
Связь WMI-моникера "WinMgmts:" с библиотекой поддержки сценариев WMI осуществляется с помощью раздела HKEY_CLASSES_ROOT\WINMGMTS, в подразделе CLSID которого записан идентификатор, указывающий, в свою очередь, на раздел HKEY_CLASSES_ROOT\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6}. Раздел же HKEY_CLASSES_ROOT\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6} содержит подраздел InProcserver32, значением которого по умолчанию является полный путь к файлу wbemdisp.dll, содержащему библиотеку поддержки сценариев WMI и реализующему объект SWbemServices. http://www.intuit.ru/department/os/compromtwin/12/2.html
Указанные разделы в реестре отсутствуют. Объект WinMgmts не может быть создан, что подтверждается тестом.
После добавления записей в реестр появилась необходимость в реализации IParseDisplayName. Добавил сам интерфейс и возможность его получения через IClassFactory_QueryInterface. Теперь тест вызывает метод ParseDisplayName у полученного интерфейса. Видимо, нужно реализовывать. http://msdn.microsoft.com/en-us/library/ms692594(VS.85).aspx
IParseDisplayName работает, IMoniker создаётся (ещё появился IMoniker). Теперь очередь за реализацией метода IMoniker::BindToObject
#6 не в ту багу :)
Тест сократил до вида On Error Resume Next Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2") If Err.Number <> 0 Then WScript.Echo Err.Number & ": " & Err.Description WScript.Quit End If Пока хватает для того, чтобы поведение совпадало с 1С
Больше не поручаем заданий bugs@.