Слишком медленный запрос WMI

Мне нужно активировать Office или нужна активация, и я использую обычный запрос в WMI:

 ManagementObjectSearcher searcher =
                        new ManagementObjectSearcher("root\\CIMV2",
                        "SELECT * FROM " + wmi + " WHERE Name LIKE \"%Office%\" ");

                    foreach (ManagementObject queryObj in searcher.Get())
                    { 
                        queryObj["Name"].ToString() + "', '" + queryObj["LicenseStatus"].ToString();                           

Но этот запрос иногда требует 45/50 секунд, теперь мне нужно понять, как его заменить или ускорить, потому что, если я использую эту команду из CMD

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE LicenseStatus=1 GET Name

Он отвечает за 2 секунды! Но я не могу интегрировать CMD в С#, только если запускаю внешнюю команду, а из CMD у меня нет полного доступа к запросу

Этот запрос работает:

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE "name like '%Office%'" Get Name

Теперь добавьте LicenseStatus=1

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE "name like '%Office%'" and LicenseStatus=1 Get Name

И запрос не работает, почему?


person Marcus J.Kennedy    schedule 05.10.2018    source источник
comment
Этот блог будет полезен blogs.msdn.com/wmi/archive/2009/06/27/, который помогает понять различия в производительности.   -  person Mayur    schedule 05.10.2018
comment
Действительно ли cmd можно захватить?   -  person Marcus J.Kennedy    schedule 05.10.2018
comment
Без лайка %% время не изменить   -  person Marcus J.Kennedy    schedule 05.10.2018
comment
@MarcusJ.Kennedy: ну, вы можете запустить консольную программу и зафиксировать ее вывод в своем приложении. См. stackoverflow.com/questions/4291912/   -  person Stefan    schedule 05.10.2018
comment
Запрос обновлен в вопросе, пожалуйста, помогите мне   -  person Marcus J.Kennedy    schedule 05.10.2018


Ответы (1)


Основываясь на заданном вами запросе WMIC, вы извлекаете только свойство «Имя», которое повышает вашу производительность, поэтому ваш запрос выполняется только в течение 2 секунд.

Итак, это...

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE LicenseStatus=1 GET Name

Будет переведен на этот запрос в вашем коде...

SELECT Name FROM SoftwareLicensingProduct WHERE LicenseStatus=1

Ваш другой пример правильный, но вам просто нужно переместить вторые кавычки

WMIC /NAMESPACE:\\root\CIMV2 PATH SoftwareLicensingProduct WHERE "name like '%Office%' and LicenseStatus=1" Get Name

Что в вашем коде будет выглядеть так (я также добавил LicenseStatus в запрос, так как вы ссылаетесь на это свойство в своей подпрограмме)

ManagementObjectSearcher searcher =
                        new ManagementObjectSearcher("root\\CIMV2",
                        "SELECT Name, LicenseStatus FROM " + wmi + " WHERE Name LIKE \"%Office%\" and LicenseStatus=1");

                    foreach (ManagementObject queryObj in searcher.Get())
                    { 
                        queryObj["Name"].ToString() + "', '" + queryObj["LicenseStatus"].ToString();

Это должно работать довольно быстро, поскольку оно получает только два свойства, которые вы используете.

person Paul G    schedule 14.10.2018