Oh,

It may be worth running these with -dd on the poller options on both the original and this new version to make sure the array formats are the same if something doesn't work right.

The output might be quite long, but you can find the WMI part easily by searching for WMI or Win32 or something.

adam.

Adam Armstrong via observium wrote on 16/11/2023 01:24:
This code was contributed about a decade ago and immediately abandoned by the author. I've never looked at this code, but it looks like at some point Mike converted it to use our more modern error generation functions, but I doubt he did much more.

Neither of us have the ability to test Windows, but you can try this replacement for the wmi_parse() function to see if it behaves better. It might explode, who knows.

function wmi_parse($wmi_string, $ret_single = FALSE, $ret_val = NULL)
{
    if (!is_string($wmi_string) || safe_empty($wmi_string)) {
        return NULL;
    }
    print_debug($wmi_string);

    $wmi_lines      = array_filter(explode(PHP_EOL, $wmi_string), 'strlen');
    $wmi_class      = NULL;
    $wmi_error      = NULL;
    $wmi_properties = [];
    $wmi_results    = [];

    foreach ($wmi_lines as $line) {
        if (str_contains($line, 'ERROR:')) {
            $wmi_error = substr($line, strpos($line, 'ERROR:') + strlen("ERROR: "));
            if (OBS_DEBUG) {
                switch ($wmi_error) {
                    case "Retrieve result data.":
                        echo("WMI Error: Cannot connect to host or Class\n");
                        break;
                    case "Login to remote object.":
                        echo("WMI Error: Invalid security credentials or insufficient WMI security permissions\n");
                        break;
                    default:
                        echo("WMI Error: Please report");
                        break;
                }
            }
            return NULL;
        }

        if (empty($wmi_class)) {
            if (str_starts($line, 'CLASS:')) {
                if (!empty($wmi_properties)) {
                    // Reset properties for a new CLASS section
                    $wmi_properties = [];
                }
                $wmi_class = substr($line, strlen("CLASS: "));
            }
        } elseif (empty($wmi_properties)) {
            $wmi_properties = explode($GLOBALS['config']['wmi']['delimiter'], $line);
        } else {
            $values = explode($GLOBALS['config']['wmi']['delimiter'], str_replace('(null)', '', $line));
            if (count($wmi_properties) !== count($values)) {
                print_error("WMI ERROR: properties count not same as values count!");
                print_debug_vars($wmi_properties);
                print_debug_vars($values);
                continue;
            }
            $wmi_results[$wmi_class][] = array_combine($wmi_properties, $values);
        }
    }

    if ($ret_single && count($wmi_results) === 1) {
        $wmi_results = reset($wmi_results);
        if ($ret_val) {
            $wmi_results = $wmi_results[$ret_val] ?? NULL;
        }
    }

    print_debug_vars($wmi_results);
    return $wmi_results;
}

Scott Kohnert via observium wrote on 16/11/2023 00:05:
First time posting and hopes that someone can assist.    Been using Subscription version of Observium for over 10 years collecting data on over 150 server farm using it daily and  have been asked to now add monitoring of Windows Services.

I started to do this via Probes and SNMP checks but due to the shear volume of services and servers involved this would be a tedious process.   I would like to use WMI to monitor Windows Services as it appears to poll faster.   Unfortunately I ran into an issue where it only displays 3 services at a time.   Windows Server has over 200 services by default, I don’t plan on monitoring all of them but at least a couple dozen.    Using WMI would be a much easier way to setup alerts if I could get the full listing to appear, which is where I am needing help.

Here is my setup to reproduce the issue (generalized information used for security)

Follow the WMI setup in the help documentation for my UB 22.04 server
Global Settings > Polling > WMI (turn on)
Server discovered via SNMP
Open Properties of Server and edit WMI information  (per server polling only no global settings)
WMI Hostname = nacn_ip_TCP:hostname.domain.local[sign]
WMI Domain= domain
WMI Username = username
WMI Password = password

After a couple of minutes, I get the results of only showing 3 services not a full list.
AllJoyn Router Service
Remote Desktop Service
Themes

I have tried this on multiple servers and the same 3 services appear each time.

I began to look into the code and run the wmic query on the web server itself using the following query

wmic -U “domain\username%password” //ncacn_ip_TCP:hostname.domain.local[sign] “select DisplayName, Name, State, Status from Win32_Service”

It gave me the full listing results and from what I can see this is where the issue lies.

CLASS: Win32_Service
DisplayName|Name|State|Status
AllJoyn Router Service|AJRouter|Stopped|OK
Application Layer Gateway Service|ALG|Stopped|OK
Application Identity|AppIDSvc|Stopped|OK
…
Telephony|tapisrv|Stopped|OK
CLASS: Win32_TerminalService
DisplayName|Name|State|Status
Remote Desktop Services|TermService|Running|OK
CLASS: Win32_Service
DisplayName|Name|State|Status
Themes|Themes|Running|OK
Storage Tiers Management|TieringEngineService|Stopped|OK
…

The first item of the WMI services is the AllJoyn Router Service, then about halfway down the listing it produces a different CLASS:Win32_TerminalService and the headers.  Then it has Remote Desktop Services and starts again with CLASS:Win32_Service and headers again, and the third entry to be displayed Themes.

Looking through the code I think the issue resides in the /opt/observium/includes/wmi.inc.php  code and the function wmi_parse. This is the function that is used (from what I can back trace) for performing the parsing of the WMI call and populating the database with the WMI entries.     But when running the mysql query for the services listing it only shows these 3 listed and not all the services that the manual query performed on the server displays.

I would like to ask if  someone can look into the WMI process and check the coding to allow the WMIC query to populate ALL the service results in the web site.

As a separate test I also went into the Global Settings > Discovery > WMI AutoDiscoveryOptions and added in several services manually (list of 10) not including the Remote Desktop Services and the results I get on the Windows Services tab show the Remote Desktop Services.   So the 2nd CLASS that appears for this service appears to be causing the issue.

  Any help is appreacited.
_______________________________________________
observium mailing list -- observium@lists.observium.org
To unsubscribe send an email to observium-le...@lists.observium.org

_______________________________________________
observium mailing list -- observium@lists.observium.org
To unsubscribe send an email to observium-le...@lists.observium.org

_______________________________________________
observium mailing list -- observium@lists.observium.org
To unsubscribe send an email to observium-le...@lists.observium.org

Reply via email to