2017-01-13 10 views
0

1.1とxScript 5.1.0.0の組み込みスクリプトリソースを使用してこれをテストし、同じ結果を得ました。私のセットとテストブロックは正常に動作します。私は非常によく似ているいくつかの他のスクリプトリソースを使用していますし、getブロックでもうまく動作します。スクリプトリソースからハッシュテーブルを取得できません。ブロックを取得します。

私は多くのバリエーションを試しましたが、いつも同じように戻ってきます。私はブロックが実行されていることを知っています。なぜなら、作成されるファイルが削除された行をコメントアウトしてファイルを参照しているからです。私はこれをpowershellの関数として実行し、出力をGet-Memberにパイプして、実際に返されるhastableであることがわかります。

DSCでこの設定を管理するためにここで使用している方法が実際には好きではありません。 DSCの中にいれば、私は他のアイデアを公開しています。

Script StorePasswordsUsingReversibleEncyption 
{ 
    SetScript = { 
     secedit /export /cfg c:\temp\secpol.cfg 
     (gc C:\temp\secpol.cfg).replace("ClearTextPassword = 1", "ClearTextPassword = 0") | Out-File C:\temp\secpol.cfg 
     secedit /configure /db c:\windows\security\local.sdb /cfg c:\temp\secpol.cfg /areas SECURITYPOLICY /quiet 
     rm -force c:\temp\secpol.cfg -confirm:$false 
    } 

    TestScript = { 
     secedit /export /cfg c:\temp\secpol.cfg 
     $str = (Get-Content 'c:\temp\secpol.cfg' | select-String 'ClearTextPassword' -SimpleMatch).ToString() 
     rm -force c:\temp\secpol.cfg -confirm:$false 
     if ($str -eq 'ClearTextPassword = 0') {return $true} 
     else {return $false}    
    } 

    # Not working yet   
    GetScript = { 
     secedit /export /cfg c:\temp\secpol.cfg 
     $str = (Get-Content 'c:\temp\secpol.cfg' | select-String 'ClearTextPassword' -SimpleMatch).ToString() 
     rm -force c:\temp\secpol.cfg -confirm:$false 
     return @{Result = $str}  
    }  
} 

私がゲット-DSCConfigurationを実行した後、出力がコンソールに返さこのです:

Get-DscConfiguration : PowerShell DSC resource MSFT_ScriptResource failed to execute Get-TargetResource functionality 
with error message: Failure to get the results from the script in a hash table format. 
At line:1 char:1 
+ Get-DscConfiguration 
+ ~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (MSFT_DSCLocalConfigurationManager:root/Microsoft/...gurationManager) 
    [Get-DscConfiguration], CimException 
    + FullyQualifiedErrorId : ProviderOperationExecutionFailure,Get-DscConfiguration 

答えて

0

あなたはこのようなあなたのgetscriptブロックを変更しようとすることができます

GetScript = { 

start-process secedit -ArgumentList '/export /cfg c:\temp\secpol.cfg' -Wait 
$str = (Get-Content 'c:\temp\secpol.cfg' | select-String 'ClearTextPassword' -SimpleMatch).ToString() 
rm -force c:\temp\secpol.cfg -confirm:$false 
return @{Result = $str}  
} 
+0

これはあまりにも動作します。ありがとう! –

4

これを試してみてください。

GetScript = { 
     $null = secedit /export /cfg c:\temp\secpol.cfg 
     $str = (Get-Content 'c:\temp\secpol.cfg' | select-String 'ClearTextPassword' -SimpleMatch).ToString() 
     rm -force c:\temp\secpol.cfg -confirm:$false 
     return @{Result = $str}  
    }  

問題は、外部コマンド(seceditなど)を呼び出すときに、このコマンドが(非常に自然なので)stdoutに書き込むすべてのものが出力として返されることです。しかし変数にキャッチしないと、スクリプトブロックの出力にさらに渡されます。 return statementもちょっと誤解を招きます。「これだけ返す」という意味ではなく、「ストリームを出力してから返す」という意味です。

これはあなたの元GetScriptは、単一のハッシュテーブルを返しませんが、むしろarraythatはこのようになっていることを意味します(私がこのケースで$nullを使用変数への外部コマンドからの出力を割り当てる

@(
    "some-output-from-secedit", 
    @{ Result = $str } 
) 

私はそれを破棄したいと指示する)あなたのスクリプトブロックの出力を乱雑にしないようにします。

もう一つの方法は、(あなたが気にしない場合)Write-Verboseに(あなたがそれを読んで興味を持っている場合)、または$nullにコマンドの出力をリダイレクトするために、次のようになります。

secedit /export /cfg c:\temp\secpol.cfg | write-verbose 
+0

ほんの小さなコメント: 'rm'(' Remove-Item'のエイリアス)が '-PassThru'パラメータなしで何かを返すのではないかと疑いがあります。とにかく+1。 – BartekB

+0

これは動作しますが、私はあなたの説明を完全に理解していません。理解しやすくするためのドキュメントにリンクしてください。ありがとうございました! –

関連する問題