bugfix> powershell > 投稿

特定のOU内のすべてのコンピューターアカウントを照会し、現在/最後にログオンしたユーザー、ユーザーの表示名、IP、システムの製造元およびモデルを取得するスクリプトをコンパイルするためのヘルプを探しています(ログオンスクリプトとしてではなく)番号、BIOSシリアル/デルサービスタグ。

このように見えるもの:

ユーザー|ユーザー表示名| IPアドレス| Dell Optiplex 3050 | 1ASDFG5

私が使用しようとしているコードは以下のものですが、残りのフィールドを取得して上記の形式でコンパイルするのにもっと助けが必要です

$computers = Get-ADComputer -Filter * -searchBase "OU=workstations,OU=workstation,DC=mydomain,DC=local"
foreach ($computer in $computers)
{
$vendor = (Get-WMIObject -ComputerName $computer.Name Win32_ComputerSystemProduct).Vendor
$name = (Get-WMIObject -ComputerName $computer.Name Win32_ComputerSystemProduct).Name
$identifyingNumber = (Get-WMIObject -ComputerName $computer.Name Win32_ComputerSystemProduct).IdentifyingNumber
$vendor
$name
$identifyingNumber
Set-ADComputer $computer –Description “$vendor | $name | $identifyingNumber”
}

回答 1 件
  • これは、何かの一部としてユーザーのコンテキストで分散形式で実行されるプロセスの一部としてよりよく達成されます。ログオンスクリプトなど または単に別のトリガーされたタスクとして(情報を最新の状態に保つためにログオン時に実行されるスケジュールされたタスクなど)。

    次に、そのようなものを実装するときに、必要な詳細を上記のスクリプトで収集し、コンピューター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("|")
    
    

    最終的に、これを使用して、目的の処理を実行できます。

あなたの答え