2017-06-21 2 views
0

他の多くのユーザーと同様、私の経験はPowerShellの経験がないLinuxにあります。だから、このオブジェクト指向プログラミングは私を台無しにしています。あるPSSessionから入力して別のPSSessionに送信する

ユーザーが割り当てられているVMをVMware Horizo​​nで検索し、ADで無効になっているかどうかを確認する必要があります。彼らがADで無効になっている場合、私はVMをリサイクルしたいです。インスタンスに設定されていない私はVMwareのホライゾンからのユーザのためにSIDを引っ張っています現時点では

、私はADに対してInvoke-Commandコマンドでこれらを使用しようとすると、私は次のようなエラー

を受け、「オブジェクト参照オブジェクト」

スクリプトこれまで

function getlist() { 
$temp=Invoke-Command -ComputerName $vdiserver -ScriptBlock { add-pssnapin vmware.view.broker; get-desktopvm | select user_sid } 
$list=$temp | Select-Object user_sid 
#$list 
} 
$vdi1="server1" 
$vdi2="server2" 
$test=Test-Connection -ComputerName $vdi1 -Quiet 
$test2=Test-Connection -ComputerName $vdi2 -Quiet 
if ($test -eq "True"){ 
$vdiserver=$vdi1 
getlist 
} 
elseif ($test2 -eq "True"){ 
$vdiserver=$vdi2 
getlist 
} 
else {echo "No servers to connect to"} 

ForEach ($user in $list) #{ 
#echo $user 
#sleep 1 
#} 
{Invoke-Command -ComputerName domaincontroller -ScriptBlock {param($p1) get-aduser -identity $p1 } -argumentlist $user} 
+0

編集とエラーメッセージが含まれていますか?あなたのスクリプトでそれが起こるように見えません。 – TessellatingHeckler

答えて

0

のだから、このオブジェクト指向プログラミングは私をめちゃくちゃにされています。

あなたはシェルスクリプトに戻って、半分の作業を達成するために2倍のコードを書こうとしています。

あなたが不足している最も重要なビットは、物事のコレクションとしてオブジェクトを想像することである - のような、あなたが/etc/passwdで作業していると、それぞれの行は、ユーザーID グループID 家を持っている想像ディレクトリはログインシェルです。あなたは一度に行全体を渡しています、それはあなたの類似のオブジェクトです。

オブジェクトには、それと同じように多くのプロパティがありますが(全体的にはより可能です)。

あなたがSelect user_sidの場合、そのフィールドを 'ライン'にとどまらせるためにそのフィールドを選択していますが、そのラインはまだ:::user_sid::::のようになり、他のフィールドは空になります。 (約)。しかし、彼らはまだそこにいる途中です。それを直接操作するには、「ライン」から完全に取り除かなければなりません。コンテナを投げ捨て、その外にuser_sidを置きます。

"sid1", "sid2", "sid3"行うものではありませんが、各SIDにはコンテナ
get-desktopvm | select user_sid 

-> 

get-desktopvm | select -expandproperty user_sid 


この

function getlist() { 
    $temp=Invoke-Command -ComputerName $vdiserver -ScriptBlock { add-pssnapin vmware.view.broker; get-desktopvm | select user_sid } 
    $list=$temp | Select-Object user_sid 
} 

関数は何も返さない、そしてそれは、ディスクまたは何か上の任意のデータは変更されませんので、関数が終了したときなので、基本的に、

function getlist() { 
    #do any amount of work here, and throw it all away. 
} 

を言っています変数はメモリから消去され、後で使用することはできません。


この:

if ($test -eq "True"){ 

はナンセンスのビットです。それはうまくいくかもしれませんが、期待通りに動作していません。なぜなら、 "真の"英単語を含む文字列にかかわらず、 "内容付きの文字列"が真の真と比較して真であるからです。しかしそれは冗長でもあります - $test自体が真または偽であるため、Trueと何かを比較する必要はありません。 if ($test)。またはさらにif (Test-Connection -ComputerName $vdi -Quiet)


しかし、まだ多くの仕事。それらにすべて接続し、接触できないものには失敗させてください。エラーを表示したくない場合は、-ErrorAction SilentlyContinueを追加してください。

$VMs = Invoke-Command -ComputerName Server1,Server2 -ScriptBlock { 
    Add-PsSnapin vmware.view.broker 
    Get-DesktopVm 
} 

今、あなたはすべてのVMを持って、今、あなたは理想的なオブジェクトの配列、すべてのVMデスクトップ特性を有する各1として$ VMを持っている必要があり、ユーザーが有効/無効の状態に

foreach ($VM in $VMs) { 

    $Sid = $VM.user_sid 

    $AdEnabled = Invoke-Command -ComputerName domaincontroller -ScriptBlock { 
     (Get-AdUser -Identity $using:Sid).Enabled 
    } 

    $VM| Add-Member -NotePropertyName 'AdEnabled' -NotePropertyValue $AdEnabled 

} 

を得ます - そのユーザーアカウントのAD EnabledプロパティのTrue/False状態も表示されます。

$VM | Out-Gridview 

または

$VM | Export-Csv Report.csv 

または

$VM | Where-Object { -not $_.AdEnabled } 
+1

頭を釘付けにして、私はstdoutで仕事をして、自分の知覚的な相対的な論理をすべてに適用したいと思っています。それぞれのステップについて説明してくれてありがとうございます。今まで私が持っていた唯一のコメントは、スクリプトの後半で関数から作成された変数を呼び出すことができるということです(これをテストしたコメント行が見えます)。 – TurboAAA

+0

次の質問は、サーバーの可用性のテストに関するものです。 2番目のエラーが発生している間に最初のサーバーが応答したとしましょう。失敗した接続が、作業中のサーバーから作成された変数をエラーで上書きしないかどうかを確認します。あるいは、powershellはエラーが発生したことを認識し、これが起きたときに何も変更しませんか? – TurboAAA

+0

私はあなたのコメントアウトされたテストラインがどのように働いているかを理解していません。あなたが単純なテストファイル 'function getlist {$ list = get-childitem c:\}を作るならば。 getlist; $ list'を実行し、新しいPowerShellセッションで実行すると、出力はありません。 (私は今それを試した)。サーバのアベイラビリティに関しては、私のバージョンでは 'Invoke-Command'の出力はすべて保存されていますが、上書きはありません。応答するすべてのサーバは、その出力を '$ VMs 'に送ります。あるサーバが応答した場合、出力を得ます。両方の応答があった場合、get-desktopvmの両方の結果が '$ VMs'にまとめられます。どちらも応答しない場合は何も得られません。 – TessellatingHeckler

関連する問題