Powershell Get-wmiobject возвращает нулевое имя пользователя, когда ПК не находится в том же домене (необходимо исправить)

Ниже приведен сценарий, который я редактирую, чтобы получить информацию о компьютере со всех компьютеров (должна быть включена) в сети, а затем экспортировать эту информацию в сценарий csv, чтобы упростить процесс инвентаризации ПК для моих клиентов.

Я сталкиваюсь с проблемой, когда при попытке получить информацию с ПК, который не подключен к тому же домену, с которого запускается скрипт, я получаю ошибку NUL от PowerShell в отношении имени пользователя. Если я удалю раздел с именем пользователя, я получу всю информацию, которая мне нужна, с этого ПК, без проблем.

Я не желаю размещать эти ПК в домене, так как они подключены через постоянную VPN на удаленном сайте, и нецелесообразно подключать их к домену из-за скорости соединения.

Есть ли способ получить имя пользователя с ПК, который не находится в том же домене?

Спасибо за вашу помощь!


ПРИМЕЧАНИЕ 0: Запуск сценария PowerShell с файлом bat, который использует обход ExecutionPolicy.

ПРИМЕЧАНИЕ 1. Я также ищу реализацию вторичного контура для каждого цикла в конце, чтобы отфильтровать отзывчивые ПК в PCInventoryFinal.csv, а не отвечающие компьютеры - в NotRespondingPC.csv (это будет работать, как только я исправлю проблему с именем пользователя)

Сообщение об ошибке в файле CSV после запуска скрипта:

"System.Management.Automation.PSArgumentNullException: не удалось обработать аргумент, поскольку значение аргумента""obj""является нулевым. Измените значение аргумента""obj""на ненулевое значение. В System.Management.Automation.PSObject.AsPSObject(Object obj) в Microsoft.PowerShell.Commands.SelectObjectCommand.ProcessExpandParameter(MshParameter p, PSObject inputObject, List`1 matchedProperties) в Microsoft.PowerShell.Commands.SelectObjectCommand.ProcessObjectObjectSjectObjectSjectObjectSjectObjectSjectSjectSjectSjectOjectSjectCjectSjectOjectSjectCjectSjectObjectSjectObjectSjectObjectSjectObjectSjectOjectSjectSjectSjectObjectSjectObjectSjectObjectSjectObjectSjectObjectSjectObjectSjectObjectSjectObjectSObjectSjectObjectSjectObjectSObjectSjectObject atObjectSjectObjectSject.ProcessRecord()
в System.Management.Automation.CommandProcessor.ProcessRecord()"


 <# Main script leveraged from https://community.spiceworks.com/topic/2000793-script-to-ping-multiple-machines which was posted by Ashishkumar7 on May 31, 2017 Added features that allowed for Text file to be used to get information from multiple PC's on the network. (Fix leveraged from same post)

Expanded features to include gathering the following:
        Dell serial code
        Last User logged in
        Current amount of ram installed
        C and D Drive sizes (If no d drive will display zero)
        CPU Type and CPU Speed
        Date of Last installed windows update
        Export all PC's and information into a csv file

    HOW TO USE:
        Export all computers list from Active Directory
        Place that txt file in the same folder with PCInventory.bat and PCInventory.ps1
        Run PCInventory.bat as administrator
     #Note:
        The PCInventory.bat runs the PCInventory.ps1 with a Powershell Script bypass and allows you to run it on any machine without first enabling Powershell scripts
        MAKE SURE THAT THE .bat AND THE .ps1 FILE NAMES MATCH
        DO NOT CHANGE FILE NAMES


    #>



    $PCData = ForEach ($PCName in (Get-Content C:\Users\it\Desktop\PCInventoryProject\PCNames.txt )) 
    { 
    $PC = ($PCName.Split())[0]

    Write-host "Checking computer'$PC'"

    try {
    Test-Connection -ComputerName $PC -Count 1 -ErrorAction Stop| Out-Null
    $OS = Get-WmiObject -ComputerName $PC -Class Win32_OperatingSystem -EA 0
    $Mfg = Get-WmiObject -ComputerName $PC -Class Win32_ComputerSystem -EA 0
    $UsrNm = Get-WMIObject -computer $PC -class Win32_ComputerSystem -EA 0| select -expandproperty username -first 1
    $SrlNm = Get-WmiObject win32_SystemEnclosure -computer $PC -EA 0| select -expandproperty serialnumber -first 1
    $MxRm = "{0} GB" -f ((Get-WmiObject win32_PhysicalMemory -ComputerName $PC -property "capacity" | Measure-Object -Property Capacity -Sum).Sum / 1GB)
    $CPUSpd = (get-wmiobject Win32_Processor -computername $PC).name.split(' ')[-1]
    $CPUType = (get-wmiobject Win32_Processor -computername $PC).name.split(' ')[2]
    $CDriveHDSize = "{0:N2} GB" -f ((get-wmiobject win32_logicaldisk -computername $PC -filter "drivetype = 3" | select -expandproperty size -first 1) / 1GB)
    $DDriveHDSize = "{0:N2} GB" -f ((get-wmiobject win32_logicaldisk -computername $PC -filter {drivetype ="3" and  deviceid ='D:'}  | select -expandproperty size -first 1) / 1GB)
    $LastUpdatedOn = get-hotfix -computername itpc | sort -descending InstalledOn |select -expandproperty InstalledOn -first 1 
    $IPs = @()
    $MACs = @()
    foreach ($IPAddress in ((Get-WmiObject -ComputerName $PC -Class "Win32_NetworkAdapterConfiguration" -EA 0 | 
    Where { $_.IpEnabled -Match "True" }).IPAddress | where { $_ -match "\." })) {
    $IPs += $IPAddress
    $MACs += (Get-WmiObject -ComputerName $PC -Class "Win32_NetworkAdapterConfiguration" -EA 0 | 
    Where { $_.IPAddress -eq $IPAddress }).MACAddress
    }
    $Props = @{
    ComputerName = $PC
    Status = 'Online'
    UserName = $UsrNm
    SerialNumber = $SrlNm
    CPUSpeed = $CPUSpd
    CPUType = $CPUType
    TotalRam = $MxRm
    CDriveSize = $CDriveHDSize
    DDriveSize = $DDriveHDSize
    WindowsUpdateDate = $LastUpdatedOn
    IPAddress = $IPs -join ', '
    MACAddress = $MACs -join ', '
    DateBuilt = ([WMI]'').ConvertToDateTime($OS.InstallDate)
    OSVersion = $OS.Version
    OSCaption = $OS.Caption
    OSArchitecture = $OS.OSArchitecture
    Model = $Mfg.model
    Manufacturer = $Mfg.Manufacturer
    VM = $(if ($Mfg.Manufacturer -match 'vmware' -or $Mfg.Manufacturer -match 'microsoft') { $true } else { $false })
    LastBootTime = ([WMI]'').ConvertToDateTime($OS.LastBootUpTime)

    }
    New-Object -TypeName PSObject -Property $Props
    } catch { # either ping failed or access denied 
    try {
    Test-Connection -ComputerName $PC -Count 1 -ErrorAction Stop | Out-Null
    $Props = @{
    ComputerName = $PC
    Status = $(if ($Error[0].Exception -match 'Access is denied') { 'Access is denied' } else { $Error[0].Exception })
    Username = ''
    SerialNumber = ''
    TotalRam = ''
    CPUSpeed = ''
    CPUType = ''
    CDriveSize = ''
    DDriveSize = ''
    WindowsUpdateDate = ''
    IPAddress = ''
    MACAddress = ''
    DateBuilt = ''
    OSVersion = ''
    OSCaption = ''
    OSArchitecture = ''
    Model = ''
    Manufacturer = ''
    VM = ''
    LastBootTime = ''
    }
    New-Object -TypeName PSObject -Property $Props 
    } catch {
    $Props = @{
    ComputerName = $PC
    Status = 'No response to ping'
    Username = ''
    SerialNumber = ''
    TotalRam = ''
    CPUSpeed = ''
    CPUType = ''
    HardDriveSize = ''
    CDriveSize = ''
    DDriveSize = ''
    WindowsUpdateDate = ''
    IPAddress = ''
    MACAddress = ''
    DateBuilt = ''
    OSVersion = ''
    OSCaption = ''
    OSArchitecture = ''
    Model = ''
    Manufacturer = ''
    VM = ''
    LastBootTime = ''
    }
    New-Object -TypeName PSObject -Property $Props 
    }
    }
    }
    $PCData | sort ComputerName |
    select ComputerName, CPUType, CPUSpeed, TotalRam, CDriveSize, DDriveSize, OSVersion, OSCaption, OSArchitecture, DateBuilt, SerialNumber, UserName,  Model, Manufacturer, WindowsUpdateDate,  Status, IPAddress, MACAddress,VM, LastBootTime |
    Export-csv -notype C:\Users\IT\desktop\PCInventoryProject\PCInventoryFinal.csv

0 ответов

Другие вопросы по тегам