WMI-запрос слишком медленный - PullRequest
0 голосов
/ 05 октября 2018

Мне нужно, чтобы 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 в C #, только если запустить внешнюю команду и из 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

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

1 Ответ

0 голосов
/ 14 октября 2018

Основываясь на запросе 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();

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

...