Bug 3760

Summary: Тест на работу WMI моникеров
Product: WINE@Etersoft Reporter: Константин Кондратюк <kondratyuk>
Component: OLE / DDE / RPCAssignee: BUGS@Etersoft <bugs>
Status: DEFERRED --- QA Contact:
Severity: minor    
Priority: P4 CC: kondratyuk, lav
Version: 1.0.10   
Target Milestone: ---   
Hardware: PC   
OS: All   
URL: http://www.script-coding.info/WMI_Processes.html
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 3761    

Description Константин Кондратюк 2009-04-01 11:26:47 MSD
Нужен тест на создание моникеров в Windows и wine.

intuit.ru:
Формат строки WMI-моникера похож на стандартный путь к объектам WMI. При этом моникеры могут состоять из трех частей:

    * обязательный префикс "WinMgmts:";
    * необязательные параметры, определяющие настройки безопасности при работе с WMI ;
    * необязательный путь к нужному объекту WMI.
Comment 1 Константин Кондратюк 2009-04-01 11:29:09 MSD
Страница, посвящённая 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
Comment 2 Константин Кондратюк 2009-04-01 11:32:01 MSD
Из трейса по +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;
    }
Comment 3 Константин Кондратюк 2009-04-01 11:33:27 MSD
Связь 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
Comment 4 Константин Кондратюк 2009-04-01 11:37:14 MSD
Указанные разделы в реестре отсутствуют. Объект WinMgmts не может быть создан, что подтверждается тестом.
Comment 5 Константин Кондратюк 2009-04-01 14:01:41 MSD
После добавления записей в реестр появилась необходимость в реализации IParseDisplayName.

Добавил сам интерфейс и возможность его получения через IClassFactory_QueryInterface.
Теперь тест вызывает метод ParseDisplayName у полученного интерфейса. Видимо, нужно реализовывать.

http://msdn.microsoft.com/en-us/library/ms692594(VS.85).aspx
Comment 6 Константин Кондратюк 2009-04-01 18:22:46 MSD
IParseDisplayName работает, IMoniker создаётся (ещё появился IMoniker).
Теперь очередь за реализацией метода IMoniker::BindToObject
Comment 7 Константин Кондратюк 2009-04-01 18:23:59 MSD
#6 не в ту багу :)
Comment 8 Константин Кондратюк 2009-04-01 18:25:24 MSD
Тест сократил до вида

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С
Comment 9 Vitaly Lipatov 2012-01-18 02:49:15 MSK
Больше не поручаем заданий bugs@.
Comment 10 Vitaly Lipatov 2012-01-18 02:52:49 MSK
Больше не поручаем заданий bugs@.