Это будет лучше достигнуто как часть процесса, который выполняется в контексте пользователя распределенным образом как часть чего-то , такого как сценарий входа в систему , или просто как другая инициируемая задача (например, запланированная задача).он запускается при входе в систему, чтобы поддерживать актуальность информации).
Затем при реализации чего-либо подобного вы можете собрать необходимые данные в указанном сценарии и отправить их обратно в объект AD компьютера.Оказавшись там, ваш запрос больше не требует, чтобы устройство было подключено к сети, и при этом это не будет долго выполняющийся сценарий.
Вот пример сценария того, что вы можете развернуть для запуска на компьютерах:
# Function to Set Value on Computer Object
function Set-ADComputerObj
{
Param ( $ComputerID, $PropertyName, $Value )
$ComputerSearcher = New-Object DirectoryServices.DirectorySearcher
$ComputerSearcher.SearchRoot = "LDAP://$("DC=$(($ENV:USERDNSDOMAIN).Replace(".",",DC="))")"
$ComputerSearcher.Filter = "(&(objectCategory=Computer)(CN=$ComputerID))"
$computerObj = [ADSI]$ComputerSearcher.FindOne().Path
$computerObj.Put( $PropertyName, $Value )
$computerObj.SetInfo()
}
# Function to Get Values from User Object
function Get-ADUserObj
{
Param ( [string]$Identity = $env:USERNAME )
IF ($Identity)
{
$UserSearcher = New-Object DirectoryServices.DirectorySearcher
$UserSearcher.SearchRoot = "LDAP://$("DC=$(($ENV:USERDNSDOMAIN).Replace(".",",DC="))")"
$UserSearcher.Filter = "(&(objectCategory=person)(SAMAccountName=$Identity))"
$UserSearcher.FindOne() | foreach {New-Object PSObject -Property:$_.Properties}
}
}
#===================================
# SAMAccountName for computer object
$ComputerID = $env:COMPUTERNAME
# SAMAccountName for user object
$UserID = $env:USERNAME
# User AD object
$UserObj = Get-ADUserObj
# Display Name for the current user
$UserDisplayName = $UserObj.displayname
# Get LAN IP Address (may need to be modified to account for multiple adapters)
$IPAddress = (Get-NetIPAddress -InterfaceAlias ((Get-NetAdapter | where {$_.Status -eq "Up" -and ($_.HardwareInterface -eq $true)}).Name) | where {$_.AddressFamily -eq "IPv4"}).IPAddress
# Get Asset Product Details
$Asset = (Get-WMIObject -ComputerName $env:COMPUTERNAME Win32_ComputerSystemProduct)
$AssetVendor = $Asset.Vendor
$AssetName = $Asset.Name
$AssetNumber = $Asset.IdentifyingNumber
# Set Parameter Values for the Set Command on Computer Object
$ComputerObjProperty = "description"
$ComputerObjValue = "$UserID|$UserDisplayName|$IPAddress|$ProductVendor|$ProductName|$ProductNumber"
#===================================
Try
{
# Set Value on Computer Object
Set-ADComputerObj -ComputerID $ComputerID -PropertyName $ComputerObjProperty -Value $ComputerObjValue
}
Catch
{
# Write error exception
$error[0].Exception
}
Затем этот сценарий создаст запрошенную строку и поместит ее в описание объекта компьютера AD.Оттуда вы можете извлечь поле описания и разделить его на разделяющий символ.
Например:
$UserID,$UserDisplayName,$IPAddress,$ProductVendor,$ProductName,$ProductNumber = ((Get-ADComputer $ComputerName).description).split("|")
В конечном итоге это можно использовать для доставки того, что вы хотите сделать.