2

だからここに私がやろうとしていることの範囲があります:

複数のサイトにある Windows コンピューターのリモート コンピューター情報を取得し、見つかった情報を Active Directory の各コンピューター オブジェクトの .Description プロパティに書き込みます。スクリプトがリモート コンピューターに接続できない場合は、その情報をテキスト ファイルに記録し、接続できないコンピューター オブジェクトに変更を加えないでください。

スクリプトの実行にかかる時間を測定するために、実行時間を測定する 2 つ目のスクリプトを用意しました。

このセットアップは、Windows 7 Pro 仮想マシン上のバッチ ファイルを介して実行される 2 番目のスクリプト (最初のスクリプトを呼び出す) を実行するためのスケジュールされたタスクとして設定されています。

私の問題は、ログに表示される情報に基づいて、スクリプトでメモリの問題が発生している可能性があることです。根本的な原因を診断する可能性のあるヘルプは、非常に高く評価されます。これ以上の別れはありませんが、これが両方のスクリプトのコードと、奇妙なログ出力のサンプルです。

メイン スクリプト (スクリプト 1):

set-location \\myscriptcomputer\c$\somefolder\PSScripts

enter code here`function Measure-Latest {
    BEGIN { $latestlogon = $null }
    PROCESS {
            if (($_ -ne $null) -and (($latestlogon -eq $null) -or ($_ -gt $latestlogon))) {
                $latestlogon = $_ 
            }
    }
    END { $latestlogon }
}
Function CreateLog {

#Create a log file
    $global:path = "C:\Somefolder\PSScripts\WriteComputerDescriptions"
    $global:LogTime = Get-Date -Format "MM-dd-yyyy_hh-mm-ss"
    $global:LogName = 'CompDescriptions'
    $global:LogFile = 'C:\Somefolder\PSScripts\WriteComputerDescriptions\'+$LogName+$LogTime+'.txt'
    Write-Host "Creating log file" -foregroundcolor yellow
    if([IO.Directory]::Exists($global:path))
    {
        #Do Nothing
    }
    else
    {
        New-Item -ItemType directory -Path C:\Somefolder\PSScripts\WriteComputerDescriptions
    }

    cd C:\Somefolder\PSScripts\WriteComputerDescriptions
    echo "WriteComputerDescriptions Script Log" >> $global:logfile

}

Function WriteDescription {
    Write-Host "Gathering Computer information..." -foregroundcolor yellow
    $UserWorkstations = get-qadcomputer -sizelimit 0 -includeallproperties -searchroot my.domain.com/MyUserWorkstations

    $IPv4Regex = "^(\d{1,3}\.){3}\d{1,3}$"
    foreach ($computerobject in $UserWorkstations) {

    $computerIP = $NULL
    $computerIP2 = $NULL
    $computerIP3 = $NULL
    $computerserial = $NULL
    $computerserial2 = $NULL
    $findlastuser = $NULL
    $findlastuser2 = $NULL
    $lastlogontime = $NULL
    $findlastuserFname = $NULL
    $findlastuserFname2 = $NULL
    $findlastuserLname = $NULL
    $findlastuserLname2 = $NULL
    $fullname = $NULL
    $userlogon = $NULL

    $computerName = $computerobject.name
    $oldcomputerdescription = $computerobject.description
    Write-Host " "
    Write-Host "Testing connection to $computerName ..."

    $testConnection = test-connection -computername $computerName -count 2 -quiet
    Write-Host "Connection is $testconnection"


        if ($testConnection -eq $True) {
            $Connect = $testConnection

        #get IP address(es)
            try {
                $computerIP = get-wmiobject -class win32_networkadapterconfiguration -filter IPEnabled=TRUE -computername $computerName
                $computerIP2 = $computerIP.ipaddress[0]
                $computerIP3 = $computerIP.ipaddress[1]
                Write-Host = $computerIP2
                if ($computerIP3 -match $IPv4Regex){
                    Write-Host = $computerIP3
                    }
                }
             catch [system.exception]{
                $connect = $False
                Write-Host "Could not connect to $computerName. No IP collected."
                }
        #get computer serial
            try {
                $computerSerial = gwmi win32_bios -computername $computerName | select serialnumber
                $computerserial2 = $computerSerial.serialnumber.tostring()
                }
            catch [system.exception]{
                Write-Host "Could not get serial for $computerName."
                $computerSerial = "Unavailable"
                $computerSerial2 = "Unavailable"
                }
        #get username of currently logged in user
            try {
                $findlastUser = gwmi win32_computersystem -computer $computerName | select username
                $findlastuser2 = ($findlastUser.username).replace("mydomain\","")
                }
            catch [system.exception]{
                Write-Host "Could not get username of logged in user on $computerName"
                $findlastUser = "Unavailable"
                $findlastUser2 = "Unavailable"
                }

        #get last logon time of user
            try {
                if($findlastuser2 -ne $NULL -and $findlastuser2 -notlike "Unavailable") {
                    #ignore domain controllers in a datacenter due to connectivity stuff
                    $lastlogontime = get-qadcomputer -computerrole domaincontroller | where { $_.name -notmatch "-COLO"} | foreach {(get-qaduser -service $_.name -samaccountname $findlastuser2).LastLogon } | Measure-Latest
                    }
                }
            catch {
                if ($lastlogontime -eq $NULL -and $findlastuser2 -eq $NULL){
                    Write-Host "Could not find a last logon time"
                    Write-Host "No username available to query"
                    $lastlogontime = "Unavailable"
                    }
                if ($lastlogontime -eq $NULL -and $findlastuser2 -ne $NULL){
                    Write-Host "Could not find a last logon time for user $findlastuser"
                    $lastlogontime = "Unavailable"
                    }
                }

        #search AD for the user identified, select first name
            try {
                $findlastuserFname = get-qaduser $findlastuser2 | select firstname
                $findlastuserFname2 = $findlastuserFname.firstname.tostring()
                }
            catch [system.exception]{
                if ($findlastuserFname2 -eq $NULL) {
                    Write-Host "No first name for user found"
                    }
                }
        #search AD for the user identified, select last name
            try {
                $findlastuserLname = get-qaduser $findlastuser2 | select lastname
                $findlastuserLname2 = $findlastuserLname.lastname
                }
            catch [system.exception] {
                if ($findlastuserLname2 -eq $NULL) {
                    Write-Host "No last name for user found"
                    }
                }       
        #join the first and last names together if both properties are available

            if ($findlastuserFname2 -ne $NULL -and $findlastuserLname2 -ne $NULL){
                $fullname = "$findlastuserFname2" + " $findlastuserLname2"
                }
            elseif ($findlastuserFname2 -eq $NULL -and $findlastuserLname -ne $NULL){
                $fullname = $findlastuserLname2
                }
            elseif ($findlastuserFname2 -ne $NULL -and $findlastuserLname -eq $NULL){
                $fullname = $findlastuserFname2
                }
            else {
                $fullname = "Unavailable"
                }

        #Set the description data format
            #With only 1 IPv4 Address
            if ($computerIP3 -notmatch $IPv4Regex -or $computerIP3 -eq $NULL){
                $newcomputerdescription = "$fullname | $computerIP2 | $computerSerial2 | $lastlogontime"
                }

            #With 2 IPv4 Addresses

            if ($computerIP3 -match $IPv4Regex) {
                $newcomputerdescription = "$fullname | $computerIP2, $computerIP3 | $computerSerial2 | $lastlogontime"
                }

        #If the description data is the same, leave it as it is
            if ($newcomputerdescription -eq $oldcomputerdescription){
                Write-Host " "
                Write-Host "Information for $computerName has not" -foregroundcolor yellow
                Write-Host "changed. No edits were made on this object." -foregroundcolor yellow
                }

            if ($newcomputerdescription -ne $oldcomputerdescription -and $Connect -eq $TRUE) {
                set-qadcomputer -identity $computerName -Description $newcomputerdescription
                Write-Host " "
                Write-Host "Computer description updated for object $computerName" -foregroundcolor yellow
                Write-Host "New host information:"
                Write-Host "$newcomputerdescription"
                }
            }
        else {
            Write-Host "Could not connect to computer $computerName"
            Write-Host "No changes made to description for $computerName"
            $noconnecterror = "Could not connect to computer $computerName"
            $noconnecterror | Out-File $global:logfile -Append -Force
        }
    }
    Write-Host "Processing complete!"
}
CreateLog -erroraction silentlycontinue
WriteDescription -erroraction silentlycontinue
start-sleep -s 3
##END OF SCRIPT

2 番目のスクリプト:

set-location \\myscriptcomputer\c$\somefolder\PSScripts
Add-PSSnapin Quest.ActiveRoles.ADManagement -erroraction SilentlyContinue
$timeoutput = Measure-Command {\\myscriptcomputer\c$\Somefolder\PSScripts\WriteComputerDescriptions.ps1}
cd \\myscriptcomputer\c$\Somefolder\PSScripts\WriteComputerDescriptions
$scriptlog = get-childitem | sort creationtime | select -last 1
$logname = $scriptlog.name
Add-Content c:\somefolder\PSScripts\WriteComputerDescriptions\$logname "`nExecution Time: $timeoutput"
Write-Host "Script complete!"
Start-sleep -s 3
exit

私の環境の Active Directory での結果では、これは数百のオブジェクトに対して効果的に機能しますが、ログ ファイルに表示される内容のサンプルを次に示します。

パソコンに接続できませんでした computer391 パソコンに接続できません computer392 パソコンに接続できません computer393 パソコンに接続できません computer394 䔊數畣楴湯吠浩㩥ㄠ㨱㘰㈺⸱㜵㤵㐰ഷ</p>

文字化けした最後の行は、おそらくメモリ関連の問題があると私に思わせたものです。コンピューターの数がはるかに少ないコンテナー/OU に対してスクリプトを実行すると、ログの最後の行は時間であり、これは通常予想されることです。

経験豊富な Powershell のプロがここでアドバイスを提供できる場合は、本当に助けていただければ幸いです。

ありがとう!

4

1 に答える 1

0

コメントが追加されない理由がわかりません。とにかく、ここに投稿させてください。空きメモリを追跡するには、パフォーマンス カウンタを確認するだけです。

これがpowershellコマンドです:

Get-Counter -Counter "\Memory\Available MBytes"
于 2013-10-18T22:24:10.493 に答える