Страницы

Поиск по вопросам

Показаны сообщения с ярлыком wmi. Показать все сообщения
Показаны сообщения с ярлыком wmi. Показать все сообщения

среда, 4 марта 2020 г.

Шифруются ли данные при использовании WMI?

#windows #шифрование #wmi


Я использую WMI запросы для получения данных об удаленных компьютерах, но передача
данных должна быть защищена. На вики и msdn'е я ничего подходящего не нашёл, но должна
же винда как - то шифровать эти данные. Где можно узнать как она это делает, ну или
не делает? Никогда не думал о таких вещах, поэтому прощу прощения, если вопрос глупый.
    


Ответы

Ответ 1



Вот здесь задавали подробный вопрос. Если верить ответу, то шифруется только аутентификация посредством Kerberos. Сами запросы не шифруются

пятница, 24 января 2020 г.

Получить статус chassis intrusion из-под windows

#windows #безопасность #железо #wmi


Возможно ли получить статус chassis intrusion из-под windows? Dell делает это с помощью
WMI, они создают свой namespace и как-то записывают туда значение, а сами предоставляют
скрипты для выборки из этих namespace. Я пробовал смотреть в Win32_SystemEnclosure,
замыкая и размыкая chassis intrusion, но ничего не менялось.
    


Ответы

Ответ 1



Попробовал поиграться с классом WMI Win32_SystemEnclosure. Так вот, при закрытом корпусе (у меня теперь есть датчик на новом корпусе :) ) запрос wmiServices.InstancesOf Win32_SystemEnclosure выдаёт (привожу только относящиеся к делу инстансы): SecurityBreach=3 BreachDescription = NULL SecurityStatus = 3 Если же открываю корпус, то, в зависимости от того, далеко ли крышка от датчика: SecurityBreach=4 или 5 BreachDescription = "Alert" или "Intrusion" SecurityStatus =1 Так что вот вам и ответ. У меня не Dell. Мать Asus, производитель корпуса, подозреваю, не при чём.

Как удалить контрольные точки windows?

#c_sharp #wmi


За основу взят этот код, я его немного переделал.

Создал метод который возвращает все контрольные точки восстановления

public static string GetPoint()
{
  var Results = new StringBuilder();
  try
  {
    using (ManagementObjectCollection searcher = new ManagementObjectSearcher("root\\DEFAULT",
"SELECT * FROM SystemRestore").Get())
    {
       foreach (ManagementBaseObject collection in searcher)
       {
          string description = collection["description"].ToString(); // Имя контрольной
точки
          string sequencenumber = ((uint)collection["sequencenumber"]).ToString();
// Номер контрольной точки

           Results.AppendLine(sequencenumber);
       }
    }
  }
  catch (Exception ex) { Console.WriteLine(ex.Message); }
  return Results.ToString();
}


На выходе получаю порядковые номера контрольных точек Windows: 62, 73, 

Но вот как мне удалить их через массив не понимаю, попробовал прогнать через foreach

foreach (var test in GetPoint()) // var возвращает char
{
   SRRemoveRestorePoint(test); // показывает только 2 
}


но это не помогло. 
Что исправить нужно?

[UPD] 

Если просто записать SRRemoveRestorePoint(62); то точка восстановления удаляется
нормально.
    


Ответы

Ответ 1



Решил вопрос следующим способом: Взял из этого примера Удаляет все контрольные точки, проверил. P.S: Для запуска требуются права Администратора. public static void GetPoint() { string[] sequencenums = new string[100]; int c = 0; try { using (ManagementObjectCollection searcher = new ManagementObjectSearcher("root\\DEFAULT", "SELECT * FROM SystemRestore").Get()) { foreach (ManagementBaseObject collection in searcher) { string description = collection["description"].ToString(); // Имя контрольной точки string sequencenumber = ((uint)collection["sequencenumber"]).ToString(); // Номер контрольной точки sequencenums[c] = sequencenumber; c++; } } } catch (Exception ex) { Console.WriteLine(ex.Message); } while (c >= 0) { int test = SRRemoveRestorePoint(Convert.ToInt32(sequencenums[c])); Console.WriteLine($"Point {test} deleted successfully!"); c--; } } Если у Вас есть предложения по улучшению, давайте) [UPD] SRRemoveRestorePoint Так же нашёл решение ещё одно, решил просто создать цикл for и прогнать в нём. Самое интересное что такой способ даже не вызывает никаких исключений и можно использовать спокойно в отдельном потоке. // Запуск от Администратора. public static void DeletePoint() { for (int i = 0; i < 100; i++) { SRRemoveRestorePoint(i); } }

воскресенье, 29 декабря 2019 г.

C# service не могу понять, где здесь утечка памяти

#c_sharp #net #windows #service #wmi


Создал сервис с помощью шаблона, сократил код до минимума, и всё равно за несколько
минут сервис уже не 4, а 8 мб занимает и продолжает расти. Вот сам код:

protected override void OnStart(string[] args)
{
    bool close = false;
    bool alreadySend = false;
    bool firstExecute = true;
    int open_counter = 1;
    while (true)
    {
        if (open_counter >= 2147483643)
            open_counter = 1;

        ManagementObjectCollection sList = null;
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select
* From Win32_USBHub");
        sList = searcher.Get();
        sList.Dispose();
        searcher.Dispose();
        open_counter++;
        System.Threading.Thread.Sleep(10);
    }
}


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


Ответы

Ответ 1



Вот тут ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_USBHub"); Вы создаете обьект. А вот тут: searcher.Dispose(); Вы говорите GC, что его можно удалить, а не удаляете его. И делаете это в цикле. Это же C#, а не С++. Тут за Вас удаляет все сборщик мусора, он сам решит когда пора чистить и, приостановив программу, почистит. Попробуйте подождать и понаблюдать. Особенно в Visual Studio это хорошо видно. Там прям график есть. С MSDN: Этот метод используется для закрытия или освобождения неуправляемых ресурсов, таких как файлы, потоки и дескрипторы, хранящиеся экземпляром класса, реализующего этот интерфейс. Согласно Конвенции этот метод используется для всех задач, связанных с освобождением ресурсов, находящихся в объекте, или подготовкой объекта к повторному использованию.

Ответ 2



Об утечке памяти можно говорить только после продолжительного наблюдения и сравнения снэпшотов состояния памяти. Сборщик мусора в CLR достаточно ленив (говоря строгим языком, его поведение недетерменировано), и если у вас на машине достаточно памяти, то собирать мусор он будет редко. Так что запускайте сервис, берите профайлер и делайте снэпшоты каждый час. А потом смотрите, остались ли в живых какие-то объекты, которые по идее должны были уже удалиться, а так же на их количество (наличие некоторого количества таких объектов нормально). P.S. Ну и да, используйте лучше using: using (var searcher = new ManagementObjectSearcher("Select * From Win32_USBHub")) using (var sList = searcher.Get()) { ... }

пятница, 27 декабря 2019 г.

Получить имя установленного антивируса

#cpp #windows #wmi


Как получить имя установленного антивируса? Пока на ум приходит лишь два варианта,
хотя у них есть свои "но": 


Парсить uninstall ветку реестра? Не вариант - придётся хранить данные всех АВ в программе.
Получать информацию об установленном АВ посредством взаимодействия с WMI? Я, погуглив,
нашёл пример с подключением к ROOT\SecurityCenter, но проблема в том что он не работает
в серверных ОС.


Есть ли какой-нибудь универсальный вариант получения имени установленного антивируса,
работающий на всех ОС или костыль конкретно под серверные?
    


Ответы

Ответ 1



Вы правы один из задокументированных способов является WMI. Однако не забывайте, то чтобы использовать этот механизм нужны будут права администратора. На вашем месте я бы пожалуй просто сделал detect по названию процесса.

Можно ли wmi список собрать в едино?

#c_sharp #wmi


Пытаюсь собрать всё максимально компактно.

Приведу пример:

private readonly static ManagementObjectSearcher Processor = new 
ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_Processor");

private readonly static ManagementObjectSearcher OperatingSys = new 
ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_OperatingSystem");

ManagementObjectCollection ProcG = Processor.Get();
foreach (var cr in ProcG)
{
   stringbuilder.AppendFormat(cr["Name"]).ToString())
}

ManagementObjectCollection OperaSys = OperatingSys.Get();
foreach (var z in OperaSys)
{
  stringbuilder.AppendFormat(z["SerialNumber"].ToString());
}


И.т.д .. Но код вышел очень длинным))

Можно ли как-нибудь объединить их?
Допустим в List? или вообще что лучше использовать?

Думал сделать так для начало как-то:

var collectionWmi = 
{ 
 "SELECT * FROM Win32_Processor", 
 "SELECT * FROM Win32_OperatingSystem",}; 


и.т.д и уже с ним работать, но я в сомнениях)

Что посоветуете?
    


Ответы

Ответ 1



Когда-то давно в институте нам вдалбливали на лабораторных работах по информатике, что любую программу можно разделить на этап сбора данных (чтение пользовательского ввода), её обработку и вывод на экран данных. Если бы у вас не было бы такого маниакального желания смешать все эти фазы в одну, чтобы сразу и читать и загонять в стринг билдер -- то вы бы увидели много вариантов по объединению похожих чтений полей. А вы думаете в терминах строк. Соберите данные в класс и представьте, что у вас не один формат, а много форматов и отделите в голове СБОР инфы от ФОРМАТИРОВАНИЯ и ВЫВОДА. Я бы сначала бы объявил класс Machine и сказал бы что у него есть prop Processors[] и остальная ваша портянка свойств. Не строки, а строгие типы. Потом бы взялся за упрощение сбора информации. И отдельно бы думал о выводе информации в нужных видах. Вы например не думаете, что у вас на одной закладке приложения могут показываться лишь данные о процессорах, а на другой -- об оперативке? И что каждый раз нужно лишь часть инфы выводить, а не сгребать всё попало в строки. Вы думаете в терминах процедурных языков, у вас по сути одна длиннющая функция. А разбить это на десяток классов, у каждого из которых будет по 10 строк кода, каждый из которых инфу по своему свойству заполняет. Процессор - о процессоре, ОС - про ОС. Увидел бы, что каждый лезет в ManagementObjectSearcher и выполняет по сути типовые операции, вынес бы это в базовый класс... Подскажите, на данный момент я использую stringbuilderи собираю все данные через strbuild.AppendFormat("",path);, Думаю за место билдера использовать List он может добавлять такие же строки через запятую? Вы по-прежнему не можете отделить в голове способ хранения информации от формата вывода. Хранить строки можно разными способами, ничего не мешает использовать List, можно хранить в Array, можно в свойствах класса. Причём вы, проектируя своё приложение вы можете как скрывать детали реализации, так и наоборот активно использовать знание о способе хранения. А вывод информации через запятую -- это только один формат, который совершенно не зависит от того, что у вас внутри - список или массив. В конкретной реализации у вас и для списка и для массива будет одно и то же: var options = new[] { "first", "second", "third"}; var display = string.Join(",", options); Тут два момента. Во-первых, замена стринг билдера на джойн ничего не меняет концептуально: меняете шило на мыло, а архитектура как была "трудоноподдерживаемый спагетти-код" -- так и осталась. Во-вторых, стринг билдер лучше, чем склейка строк: вряд ли вас интересуют копейки производительности (у вас в приложении есть множество мест, которые на порядки больше съедают ресурсов), но всё же если вы вспомните, что строки в c# -- неизменяемые объекты и сто раз делая склеивание строк вы сто раз создаёте новые объекты, в которые помещаете данные. В общем-то стринг билдер как раз и нужен в случаях, подобных вашему. И ещё. Какая разница, как форматировать строки? Может быть вы завтра захотите свою программу сделать веб-приложением -- и не будет у вас ни стринг билдера, ни склейки Join'ом -- а будет у вас Razor и он будет строить
    список из вашего List'а.

    Ответ 2



    Я бы каждый WMI запрос обернул бы собственный тип. Получится, что в коде не будет каши и будет соблюден принцип "разделяй и властвуй". Так же результаты каждого запроса будут типизированны, так как вы загоните их в собственный тип. Затем бы переопределил метод ToString(), что бы все возвращалось в виде название поля-значение. А уже вот эти маленькие классы объединил бы в более общую сущность SystemInfo, где бы были перечислены эти типы. В SystemInfo добавил бы метод GetReport(), который бы вызвал ToString() у каждого поля и вернул бы единую строку.

понедельник, 16 декабря 2019 г.

Как сделать скриншот с удаленного рабочего стола?

#c_sharp #администрирование #vba #powershell #wmi


Допустим, есть 10 IP машин, на которых крутится какой - то процесс, который хочется
контролировать.

Можно ли со своей рабочей машины послать какую-нибудь команду, которая бы сделала
скриншот и передала его мне на основную машину? Даже достаточно было бы если бы скриншот
выложился бы в какое-нибудь общедоступное место, такое как сетевая папка. Возможно
ли такое?

В приоритете решение на VBA (не путать сVB.NET) и без дополнительной установки софта.

Может быть можно решить задачу используя WMI?

Если нативно это сделать нельзя, то какими методами этого можно добиться? 
    


Ответы

Ответ 1



Готовый скрипт для Powershell, позволяющий сделать скриншот, всегда лежит в центре сценариев Technet Теперь об удаленном запуске. Собственно, сама возможность удаленного запуска должна быть разрешена. Вроде как это можно сделать при помощи PowerShell'овского Enable-PSRemoting-Force. Это запустит службу удаленного управления WinRM и пропишет исключения в брандмауэре. Но можно сделать для всего домена, используя механизм групповых политик. Как запустить? В голову приходят пара вариантов: Самый простой способ. ЕМНИП, начиная с XPюши: wmic /node:"имя_компа" process call create запускаемый_файл Через powershell: Invoke-Command -ComputerName имя_Компа -ScriptBlock { запускаемый_файл } -credential имя_пользователя # имя_пользователя - если необходимо Можно ещё работать с VB&WMI, но навскидку я не помню, как. Но, думаю, для решения задачи и двух вышеприведённых вариантов достаточно.

Ответ 2



для старых машин можно использовать psexec https://docs.microsoft.com/en-us/sysinternals/downloads/psexec для запуска утилиты.. например http://www.irfanview.com/ i_view32.exe /capture=0

четверг, 5 декабря 2019 г.

Настройка планировщика на подключение флешки

#windows #powershell #task #wmi #background_task


Надо сделать, чтобы при подключении определенной флешки запускалась программа. В
интернете пишут, что можно через планировщик, но никто не пишет, как именно.
    


Ответы

Ответ 1



Я слегка слукавил, без планировщика не обойтись, хотя, наверное, можно и через автозагрузку решить всё это. Я для одного пожилого сотрудника когда-то использовал вот такой скрипт, который срабатывал, если вставлялась флэшка, автоопределяемая с буквой T и меткой "BP_flahka". Если буква диска не важна, то вместо if ($driveLetter -eq 'T:' -and $driveLabel -eq 'BP_flashka') можно использовать просто if ($driveLabel -eq 'ТутМеткаВашейФлэшки'). Код скрипта: #Requires -version 2.0 Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange write-host (get-date -format s) " Beginning script..." do{ $newEvent = Wait-Event -SourceIdentifier volumeChange $eventType = $newEvent.SourceEventArgs.NewEvent.EventType $eventTypeName = switch($eventType) { 1 {"Configuration changed"} 2 {"Device arrival"} 3 {"Device removal"} 4 {"docking"} } write-host (get-date -format s) " Event detected = " $eventTypeName if ($eventType -eq 2) { $driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName $driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName write-host (get-date -format s) " Drive name = " $driveLetter write-host (get-date -format s) " Drive label = " $driveLabel # Запустить, если буква диска и метка совпали с нужными значениями if ($driveLetter -eq 'T:' -and $driveLabel -eq 'BP_flashka') { write-host (get-date -format s) " Starting task in 3 seconds..." start-sleep -seconds 3 start-process "E:\sync.bat" } } Remove-Event -SourceIdentifier volumeChange } while (1-eq1) #Идём в цикле дальше Unregister-Event -SourceIdentifier volumeChange Дальше всё просто. В планировщике создаём новое задание, с такими параметрами: Триггер: At log on Действие: Start a program Program/script: powershell Аргументы: -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "Диск:\Путь\имя файла со скриптом.ps1" Update 1. Проверок для вставляемого хранилища можно устроить массу. Например: # узнаем тип файловой системы флэшки $fileSystem = ([wmi]"Win32_LogicalDisk='$driveLetter'").FileSystem # проверяем, сколько свободного места осталось (в байтах) на флэшке $freeSpace = ([wmi]"Win32_LogicalDisk='$driveLetter'").FreeSpace # или общий размер всей флэшки: $size = ([wmi]"Win32_LogicalDisk='$driveLetter'").Size # и так далее, а затем просто проверяем нужный нам параметр, например: if ($fileSystem -eq 'NTFS') { # в этом случае бэкап можно делать одним большим файлом } # и так далее Update 2. Работать будет, начиная с Windows Vista/Server 2008

воскресенье, 7 июля 2019 г.

Как программно получить список всех свойств устройства в Device Manager'e?

Привет всем!
Возникла идея написать приложение на подобии USBDeview (приложение, отображающее все подключенные на данный момент USB девайсы). Хочу также реализовать функционал включения/выключения USB устройства по расписанию (USBDeview тоже так умеет). Все манипуляции провожу через запросы к WMI . Столкнулся с рядом проблем:
При подключении нового USB устройства появляются два девайса - USB Mass Storage Device и Disk Drive. Какое из включать/выключать, чтобы USB устройство правильно отключилось? Запрос "select * from Win32_PnpEntity" возвращает довольно скудный набор свойств (например отсутствуют нужные мне параметры, такие как Matching device Id, Class, Is connected и т.д. - все эти параметры есть в Device Manager'e во вкладке Details). Отсюда вытекает вопрос. Как отобразить ВСЕ свойства, которые есть в Device Manager'e? Небольшой пример кода на C#:
class Program { static void Main(string[] args) { ManagementObjectCollection collection; using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnpEntity")) collection = searcher.Get();
foreach (var device in collection) { Console.WriteLine("==================================="); foreach (var prop in device.Properties) Console.WriteLine("\t{0} : {1}", prop.Name, prop.Value); Console.WriteLine("==================================="); }
collection.Dispose();
Console.Read(); }
При подключении флешки появляется два новых устройства:
Disk Drive:
USB Mass Storage Device:
Мне же нужно получить список этих свойств:
Подскажите, пожалуйста, в каком направлении мне идти?


Ответ

При подключении нового USB устройства появляются два девайса - USB Mass Storage Device и Disk Drive. Какое из включать/выключать, чтобы USB устройство правильно отключилось?
Я полагаю, USB Mass Storage Device, т.к. Disk Drive является для него дочерним устройством, и отключается автоматически
Как отобразить ВСЕ свойства, которые есть в Device Manager'e?
Не знаю насчет "все", но довольно много свойств можно получить с помощью Setup API. Функция на C++ для вывода всех свойств по заданному ID устройства:
#pragma comment(lib,"Setupapi.lib")
#include #include #include #include #include #include
void ErrorMes(LPTSTR lpszFunction) { // Retrieve the system error message for the last-error code
LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError();
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
// Display the error message and exit the process
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); wprintf(L"%s failed with error %d: %s", lpszFunction, dw, lpMsgBuf);
LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf);
}
/*Вывод информации об устройстве с указанным InstanceID*/ BOOL PrintDevice(wchar_t* id) { unsigned index; HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; TCHAR id_upper[1024]=L""; TCHAR buf[1024]=L""; DEVPROPTYPE dpt=0; DEVPROPKEY arr[100]; DWORD count=0;
for(int i=0;i // List all connected devices hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES); for (index = 0; ; index++) { DeviceInfoData.cbSize = sizeof(DeviceInfoData); if (!SetupDiEnumDeviceInfo(hDevInfo, index, &DeviceInfoData)) { return FALSE; // no match }
BOOL res=SetupDiGetDeviceProperty(hDevInfo,&DeviceInfoData, &DEVPKEY_Device_InstanceId,&dpt,(PBYTE)buf,1000,NULL,0); if(res==FALSE)continue;
if(wcscmp(buf,id_upper)==0){ //устройство найдено res=SetupDiGetDeviceProperty(hDevInfo,&DeviceInfoData, &DEVPKEY_Device_DeviceDesc,&dpt,(PBYTE)buf,1000,NULL,0);
//вывод названия устройства if(res==FALSE)ErrorMes(L"SetupDiGetDeviceProperty"); else wprintf(L"* %s's properties: *

",buf);
//получение свойств res=SetupDiGetDevicePropertyKeys(hDevInfo,&DeviceInfoData,arr,100,&count,0); if(res==FALSE)ErrorMes(L"SetupDiGetDevicePropertyKeys");
for(int i=0;i if(res==FALSE){ErrorMes(L"SetupDiGetDeviceProperty");continue;}
//вывод DEVPROPKEY wprintf(L"{%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX; %3d}: ", arr[i].fmtid.Data1, arr[i].fmtid.Data2, arr[i].fmtid.Data3, arr[i].fmtid.Data4[0], arr[i].fmtid.Data4[1], arr[i].fmtid.Data4[2], arr[i].fmtid.Data4[3], arr[i].fmtid.Data4[4], arr[i].fmtid.Data4[5], arr[i].fmtid.Data4[6], arr[i].fmtid.Data4[7], arr[i].pid);
//вывод типа и значения свойства switch (dpt) { case DEVPROP_TYPE_STRING:wprintf(L"String \t%s
",buf); break; case DEVPROP_TYPE_STRING_LIST:wprintf(L"Strings \tFirst line: %s
",buf);break; case DEVPROP_TYPE_BOOLEAN:wprintf(L"Bool \t%d
",(bool)*((LPBYTE)(&buf)));break; case DEVPROP_TYPE_UINT16:wprintf(L"%Uint16 \t%d
",*((LPWORD)(&buf)));break; case DEVPROP_TYPE_UINT32:wprintf(L"Uint \t%d
",*((LPUINT)(&buf)));break; case DEVPROP_TYPE_GUID: wprintf(L"GUID \t{%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}
", (*((GUID*)(&buf))).Data1, (*((GUID*)(&buf))).Data2, (*((GUID*)(&buf))).Data3, (*((GUID*)(&buf))).Data4[0], (*((GUID*)(&buf))).Data4[1], (*((GUID*)(&buf))).Data4[2], (*((GUID*)(&buf))).Data4[3], (*((GUID*)(&buf))).Data4[4], (*((GUID*)(&buf))).Data4[5], (*((GUID*)(&buf))).Data4[6], (*((GUID*)(&buf))).Data4[7]);
break; case DEVPROP_TYPE_BINARY:wprintf(L"(Binary data)
");break;
default:wprintf(L"Other \tType: 0x%x
",(int)dpt); break; }
}
SetupDiDestroyDeviceInfoList(hDevInfo); return TRUE; }//end if
}//end for
SetupDiDestroyDeviceInfoList(hDevInfo); return FALSE;//устройство не найдено }
int main() { setlocale(LC_ALL,"Russian");
PrintDevice(L"USB\\VID_046E&PID_5505\\5&15C311E1&0&6");
system("PAUSE"); return 0; }
Пример вывода:
* Составное USB устройство's properties: *
{A45C254E-DF1C-4EFD-8020-67D146A850E0; 2}: String Составное USB устройство {A45C254E-DF1C-4EFD-8020-67D146A850E0; 3}: Strings First line: USB\VID_046E&PID_5505&REV_0100 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 4}: Strings First line: USB\DevClass_00&SubClass_00&Prot_00 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 6}: String usbccgp {A45C254E-DF1C-4EFD-8020-67D146A850E0; 9}: String USB {A45C254E-DF1C-4EFD-8020-67D146A850E0; 10}: GUID {36FC9E60-C465-11CF-8056-444553540000} {A45C254E-DF1C-4EFD-8020-67D146A850E0; 11}: String {36fc9e60-c465-11cf-8056-444553540000}\0009 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 12}: Uint 0 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 13}: String (Стандартный USB хост-контроллер) {A45C254E-DF1C-4EFD-8020-67D146A850E0; 15}: String Port_#0006.Hub_#0003 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 16}: String \Device\USBPDO-6 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 17}: Uint 132 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 21}: GUID {9D7DEBBC-C85D-11D1-9EB4-006008C3A19A} {A45C254E-DF1C-4EFD-8020-67D146A850E0; 22}: Uint 15 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 23}: Uint 0 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 24}: String USB {A45C254E-DF1C-4EFD-8020-67D146A850E0; 30}: Uint 6 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 32}: (Binary data) {A45C254E-DF1C-4EFD-8020-67D146A850E0; 33}: Uint 3 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 34}: Uint 3 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 36}: Uint 0 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 38}: GUID {23447943-B752-11E7-B8FD-806E6F6E6963} {B725F130-47EF-101A-A5F1-02608C9EEBAC; 10}: String Составное USB устройство {78C34FC8-104A-4ACA-9EA4-524D52996E57; 256}: String USB\VID_046E&PID_5505\5&15C311E1&0&6 {4340A6C5-93FA-4706-972C-7B648008A5A7; 2}: Uint 25182218 {4340A6C5-93FA-4706-972C-7B648008A5A7; 3}: Uint 0 {4340A6C5-93FA-4706-972C-7B648008A5A7; 7}: Strings First line: USB\VID_046E&PID_5505&MI_00\6&157c6e38&0&0000 {4340A6C5-93FA-4706-972C-7B648008A5A7; 8}: String USB\ROOT_HUB30\4&1ed8c4ae&0&0 {4340A6C5-93FA-4706-972C-7B648008A5A7; 9}: Strings First line: USB\VID_046E&PID_5505&MI_00\6&157c6e38&0&0000 {4340A6C5-93FA-4706-972C-7B648008A5A7; 10}: Strings First line: USB\VID_09DA&PID_000A\5&15c311e1&0&3 {AFD97640-86A3-4210-B67C-289C41AABE55; 2}: Bool 0 {8C7ED206-3F8A-4827-B3AB-AE9E1FAEFC6C; 2}: GUID {23447943-B752-11E7-B8FD-806E6F6E6963} {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 5}: Bool 1 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 6}: Bool 0 {83DA6326-97A6-4088-9453-A1923F573B29; 15}: Bool 1 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 16}: Bool 0 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 8}: Uint 2026182162 {8C7ED206-3F8A-4827-B3AB-AE9E1FAEFC6C; 4}: Bool 0 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 14}: Strings First line: \Driver\usbccgp {3464F7A4-2444-40B1-980A-E0903CB6D912; 10}: Uint 3 {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 4}: String USB Multimedia Keyboard {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 7}: String usb.inf:USB\COMPOSITE,Composite.Dev.NT {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 9}: (Binary data) {540B947E-8B40-45BC-A8A2-6A0B894CBDA2; 10}: String \_SB.PCI0.XHC.RHUB.HS06 {80497100-8C73-48B9-AAD9-CE387E19C56E; 6}: Uint 0 {80497100-8C73-48B9-AAD9-CE387E19C56E; 7}: Other Type: 0x9 {83DA6326-97A6-4088-9453-A1923F573B29; 3}: String usb.inf:392c3d53461eda3a:Composite.Dev.NT:10.0.15063.674:USB\COMPOSITE {83DA6326-97A6-4088-9453-A1923F573B29; 10}: String USB\ROOT_HUB30\4&1ed8c4ae&0&0 {83DA6326-97A6-4088-9453-A1923F573B29; 100}: Other Type: 0x10 {83DA6326-97A6-4088-9453-A1923F573B29; 101}: Other Type: 0x10 {83DA6326-97A6-4088-9453-A1923F573B29; 102}: Other Type: 0x10 {A45C254E-DF1C-4EFD-8020-67D146A850E0; 37}: Strings First line: PCIROOT(0)#PCI(1400)#USBROOT(0)#USB(6) {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 2}: Other Type: 0x10 {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 3}: String 10.0.15063.674 {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 4}: String USB Composite Device {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 5}: String usb.inf {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 6}: String Composite.Dev.NT {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 8}: String USB\COMPOSITE {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 9}: String Microsoft {A8B865DD-2E3D-4094-AD97-E593A70C75D6; 14}: Uint 16719875 Для продолжения нажмите любую клавишу . . .
Свойства определяются по значениям DEVPROPKEY. Чтобы понять, что это за свойство, нужно сравнить его с константами из Devpkey.h (например, Matching Device ID - это DEVPKEY_Device_MatchingDeviceId).

вторник, 21 мая 2019 г.

Шифруются ли данные при использовании WMI?

Я использую WMI запросы для получения данных об удаленных компьютерах, но передача данных должна быть защищена. На вики и msdn'е я ничего подходящего не нашёл, но должна же винда как - то шифровать эти данные. Где можно узнать как она это делает, ну или не делает? Никогда не думал о таких вещах, поэтому прощу прощения, если вопрос глупый.


Ответ

Вот здесь задавали подробный вопрос. Если верить ответу, то шифруется только аутентификация посредством Kerberos. Сами запросы не шифруются

среда, 5 декабря 2018 г.

Пример работы с WMI из под Qt5

Ребят подскажите существуют ли стандартные методы для работы с WMI из под Qt. В доках нашёл какой-то QAxObject а примеров нет. Как использовать смутно представляю.


Ответ

Пример работы с WMI с использованием QAxObject Ссылка, есть немного костыльные варианты выполнения powershell скриптов которые орудуют с WMI и разбора результата их выполнения Пример

понедельник, 8 октября 2018 г.

Настройка планировщика на подключение флешки

Надо сделать, чтобы при подключении определенной флешки запускалась программа. В интернете пишут, что можно через планировщик, но никто не пишет, как именно.


Ответ

Я слегка слукавил, без планировщика не обойтись, хотя, наверное, можно и через автозагрузку решить всё это.
Я для одного пожилого сотрудника когда-то использовал вот такой скрипт, который срабатывал, если вставлялась флэшка, автоопределяемая с буквой T и меткой "BP_flahka". Если буква диска не важна, то вместо if ($driveLetter -eq 'T:' -and $driveLabel -eq 'BP_flashka') можно использовать просто if ($driveLabel -eq 'ТутМеткаВашейФлэшки'). Код скрипта:
#Requires -version 2.0 Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange write-host (get-date -format s) " Beginning script..." do{ $newEvent = Wait-Event -SourceIdentifier volumeChange $eventType = $newEvent.SourceEventArgs.NewEvent.EventType $eventTypeName = switch($eventType) { 1 {"Configuration changed"} 2 {"Device arrival"} 3 {"Device removal"} 4 {"docking"} } write-host (get-date -format s) " Event detected = " $eventTypeName if ($eventType -eq 2) { $driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName $driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName write-host (get-date -format s) " Drive name = " $driveLetter write-host (get-date -format s) " Drive label = " $driveLabel # Запустить, если буква диска и метка совпали с нужными значениями if ($driveLetter -eq 'T:' -and $driveLabel -eq 'BP_flashka') { write-host (get-date -format s) " Starting task in 3 seconds..." start-sleep -seconds 3 start-process "E:\sync.bat" } } Remove-Event -SourceIdentifier volumeChange } while (1-eq1) #Идём в цикле дальше Unregister-Event -SourceIdentifier volumeChange
Дальше всё просто. В планировщике создаём новое задание, с такими параметрами: Триггер: At log on Действие: Start a program Program/script: powershell Аргументы: -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "Диск:\Путь\имя файла со скриптом.ps1"
Update 1.
Проверок для вставляемого хранилища можно устроить массу. Например:
# узнаем тип файловой системы флэшки $fileSystem = ([wmi]"Win32_LogicalDisk='$driveLetter'").FileSystem # проверяем, сколько свободного места осталось (в байтах) на флэшке $freeSpace = ([wmi]"Win32_LogicalDisk='$driveLetter'").FreeSpace # или общий размер всей флэшки: $size = ([wmi]"Win32_LogicalDisk='$driveLetter'").Size # и так далее, а затем просто проверяем нужный нам параметр, например: if ($fileSystem -eq 'NTFS') { # в этом случае бэкап можно делать одним большим файлом } # и так далее
Update 2. Работать будет, начиная с Windows Vista/Server 2008