Wmi_NetworkLoginProfile returning empty properties from remote servers

I’ve got a pretty simple query to pull back the last logon date for every account that has logged into a server. It works great on any server that I remote to and run it on but when I try to feed a list of servers to it, it comes back with empty values for almost all of the properties under the Wmi_NetworkLoginProfile class. I have domain admin access on the account I’m using and remote is enabled on all the servers. DCOM looks correct as well. If I remote to any of the servers in my server list and run it locally, it returns all the values with no issue. It just won’t return them when I run it for a list of all the servers. I have over 6000 servers that are a variety of Windows versions but all are at least 2008 or later. Help! I am relatively new to PowerShell but this seems like it would be a permissions issue but I don’t know what other permissions I would need to pull this. Thanks for the help!!!

#Set workstation list file (get list of workstations from file)
$list = Get-Content "C:\Users\A-BLBURKHA\scripts\ServerList.txt"

#Set Output file
$OUTPUT = "C:\Users\A-BLBURKHA\scripts\Server_Logged_On_Users.csv"
#set headers in CSV output file
echo "ServerName,User,LogonTime" | Out-File -FilePath $OUTPUT

#begin script logic
$list | ForEach-Object {

echo "Current computer $_"

#Test if system is online
Invoke-Expression "ping -n 1 -w 500 $_" | Out-Null
$ping = $LASTEXITCODE

#If Pingable perform the following collection actions
if (!$ping){

#Retrieve listings of ALL users that have logged on to the server and send results to Output File

$NetLogs = Get-WmiObject Win32_NetworkLoginProfile -ComputerName $_
foreach ($NetLog in $NetLogs) {

if ($NetLog.UserType -eq "Normal Account" -AND $NetLog.LastLogon -match "(\d{14})") {
$row = "" | Select Name,LogonTime
$row.Name = $NetLog.Name
$row.LogonTime=[datetime]::ParseExact($matches[0], "yyyyMMddHHmmss", $null)
foreach ($RName in $row) {
$Name = $row.Name
$LTime = $row.LogonTime
#Write "ServerName, Name, and TimeStamp" results to Output File
echo "$_,$Name,$LTime" >> $OUTPUT }
}
}

} else {
#If System is not pingable, the System Name is written to the NotPingable.csv file
echo "$_ not pingable"
echo "$_" >> NotPingable.csv
}

}

Your code is quiet … hmmm … let’s say immature … :wink:

You may start to write pure Powershell code and get rid of aliasses and external tools like ping. Powershell can do better. :wink:

Start with something like this and extend it to your needs

$ServerList = Get-Content "C:\Users\A-BLBURKHA\scripts\ServerList.txt"
Foreach ($ComputerName in $ServerList) {
    If (Test-Connection -ComputerName $ComputerName -Count 1 -Quiet) {
        Get-CimInstance -ClassName Win32_NetworkLoginProfile -ComputerName $ComputerName |
        Where-Object { $_.UserType -eq 'Normal Account' } |
        ForEach-Object {
            [PSCustomObject]@{
                ComputerName = $ComputerName
                Name         = $_.Caption
                LastLogon    = $_.LastLogon
            }
        }
    }
}

Of course you can pipe the results to CSV file or save it to a variable to use it for further steps in code.

I’m definitely immature! Thanks for the guidance. I’ll get there…