Назад | Перейти на главную страницу

Каковы минимальные разрешения на чтение WMI-класса MSSerial_PortName?

Я настраиваю пользователя локального приложения (часть BUILTIN \ Users) в киоске Windows 7. В киоске есть специальный USB-устройство работает на виртуальном COM-порту. Пользователю необходимо разрешение на чтение класса WMI, MSSerial_PortName, в root\WMI пространство имен, чтобы найти COM-порт. В PowerShell (который я использую для проверки конфигурации)

PS> Get-WmiObject -namespace 'root\WMI' -class 'MSSerial_PortName'

и обычным кодом .NET (так написано приложение)

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSSerial_PortName");

Я получаю сообщение об ошибке «Доступ запрещен», если я не работаю с правами администратора или с повышенными правами. я прочитал много из Вопросы и ответы на аналогичных доступ проблемы, но большинство из них, похоже, рекомендует работать от имени администратора. Это не вариант для этого пользователя / киоска / конфигурации. И на данный момент я не могу использовать управляемая оболочка от производителя устройства.

Я поигрался в консоли управления Microsoft, загрузил элемент управления WMI и изменил свойства | Безопасность | пространство имен: Root \ WMI. Я установил для группы «Пользователи» те же разрешения, что и для группы «Администраторы». Но это не сработало (я все равно догадывался).

Я не могу найти документацию MSDN по MSSerial_PortName в MSSerial "базовый" класс или другие связанные классы в пространстве имен (как предлагается этим статья). И я больше ничего не знаю о безопасности WMI.

Сегодня я попал в ту же стену. Это работает для меня временно ...

catch (ManagementException ex)
{
    Debug.WriteLine( string.Format( "##DBG An error occurred while querying for WMI data to find available COM ports:\n Message: {0}\n Stacktrace: {1}",  ex.Message, ex.StackTrace) );

    bool bSucceed = true;

    // TODO Q&D solutions. As it does not work as expected (on windows 7 ) we create our ow default list here and check if we can open the ports
    for (int x = 1; x <= 9; x++)
    {
        bSucceed = true;
        cComportName = string.Format("COM{0}", x);

        /////////////////////
        // Check if we can open it here

        // Set the port's settings
        m_comport.BaudRate = 9600; 
        m_comport.DataBits = 8; // int.Parse(cmbDataBits.Text);
        m_comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "1" );
        m_comport.Parity = (Parity)Enum.Parse(typeof(Parity), "None" );
        m_comport.PortName = cComportName;
        try
        {
            // Open the port
            m_comport.Open();
        }
        catch (UnauthorizedAccessException) { bSucceed = false; }
        catch (IOException) { bSucceed = false; }
        catch (ArgumentException) { bSucceed = false; }

        if (bSucceed) 
        {
            m_comport.Close();
            m_listComPorts.Add(new string[ConstComPortAttr.COMPORT_MAX_COLUMNS] { cComportName, cInstanceName });
        }

    }

Я нашел другой способ в PowerShell, и он не требует прав администратора:

PS> Get-WmiObject -Namespace root/cimv2 -Class Win32_PnPEntity -Filter "ClassGuid='{4d36e978-e325-11ce-bfc1-08002be10318}'"

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