Was sind die Mindestberechtigungen zum Lesen der WMI-Klasse 'MSSerial_PortName'?

7

Ich konfiguriere einen lokalen Anwendungsbenutzer (Teil von BUILTIN \ Users) auf einem Windows 7-Kiosk. Der Kiosk verfügt über ein spezielles USB-Gerät, das an einem virtuellen COM-Anschluss ausgeführt wird. Der Benutzer benötigt die Berechtigung zum Lesen der WMI-Klasse MSSerial_PortNameim root\WMINamespace, um den COM-Port zu finden. In PowerShell (mit dem ich die Konfiguration überprüfe)

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

und durch regulären .NET-Code (so wird die Anwendung geschrieben)

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

Ich erhalte die Fehlermeldung "Zugriff verweigert", es sei denn, ich werde als Administrator oder Sitzung mit erhöhten Rechten ausgeführt. Ich habe viel von Q & A auf ähnliche Zugriffsprobleme, aber die meisten scheinen laufen als Administrator zu empfehlen. Dies ist keine Option für diesen Benutzer / Kiosk / Konfiguration. Derzeit kann ich den verwalteten Wrapper des Geräteherstellers nicht verwenden.

Ich habe in der Microsoft Management Console herumgespielt, das WMI-Steuerelement geladen und die Eigenschaften | geändert Sicherheit | Namespace: Root \ WMI. Ich habe festgelegt, dass die Benutzergruppe dieselben Berechtigungen wie die Administratorgruppe hat. Aber das hat nicht funktioniert (ich habe sowieso nur geraten).

Ich kann keine MSDN-Dokumentation für MSSerial_PortName die MSSerial"Basis" -Klasse oder andere verwandte Klassen im Namespace finden (wie in diesem Artikel vorgeschlagen ). Und ich weiß nichts anderes über WMI-Sicherheit.

Anthony Mastrean
quelle

Antworten:

1

Ich bin heute gegen dieselbe Wand gestoßen. Das funktioniert bei mir vorübergehend ...

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

    }
Jan.
quelle
3
Ich kann nicht einfach jeden COM-Port ausprobieren. Es gibt mehrere serielle Geräte an diesem Kiosk, und ich muss ein ganz bestimmtes abfragen und auswählen.
Anthony Mastrean
0

Ich habe in PowerShell einen anderen Weg gefunden und es sind keine Administratorrechte erforderlich:

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

Leider erhalten Sie keinen Portnamen in COMx-Form, aber mit einer einfachen Textanalyse sollten Sie in der Lage sein, den Portnamen aus dem Gerätenamen zu extrahieren.

MBu
quelle