Quais são as permissões mínimas para ler a classe WMI 'MSSerial_PortName'?

7

Estou configurando um usuário de aplicativo local (parte de BUILTIN \ Users) em um quiosque do Windows 7. O quiosque tem um dispositivo USB especial em execução em uma porta COM virtual. O usuário precisa de permissão para ler a classe WMI, MSSerial_PortName , no namespace root\WMI , para localizar a porta COM. No PowerShell (que estou usando para verificar a configuração)

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

e pelo código .NET regular (que é como o aplicativo é escrito)

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

Recebo erros de "acesso negado", a menos que seja executado como administrador ou sessão elevada. Eu li bastante de Q & A em semelhante acessa problemas, mas a maioria parecem recomendar a execução como administrador. Isso não é uma opção para este usuário / quiosque / configuração. E, no momento, não posso usar o wrapper gerenciado do fornecedor do dispositivo.

Eu brinquei no Console de Gerenciamento Microsoft, carreguei o Controle WMI e modifiquei o Propriedades | Segurança | namespace: raiz \ WMI. Eu defino o grupo Usuários para ter as mesmas permissões que o grupo Administradores. Mas isso não funcionou (eu estava apenas adivinhando de qualquer maneira).

Não consigo encontrar nenhuma documentação MSDN sobre a classe MSSerial_PortName the MSSerial "base" ou outras classes relacionadas no namespace (como sugerido por este artigo ). E eu não sei mais nada sobre a segurança do WMI.

    
por Anthony Mastrean 13.06.2012 / 22:31

2 respostas

1

Eu bati na mesma parede hoje. Isso funciona para mim temporariamente ...

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 });
        }

    }
    
por 14.06.2012 / 13:19
0

Encontrei outro jeito no PowerShell e ele não exige privilégios de administrador:

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

Infelizmente, ele não fornece o nome do port no formulário COMx, mas usando uma análise de texto simples, você deve conseguir extrair o nome da porta do nome do dispositivo.

    
por 19.05.2018 / 10:57