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