远程运行ps命令

我编写了一个脚本,其功能类似于gpo编辑器,它可以获取一些GPO和OU并将其链接或取消链接,具体取决于用户的意愿。现在,此脚本在域控制器计算机上运行时确实可以运行,但是我需要它在域上的Windows 10计算机工作站上运行。因此,我需要在向用户显示GUI时进行调整,所有代码都必须调用DC上的命令。我不知道出了什么问题,但是当我手动输入命令一个接一个地运行时,当它作为脚本运行时,我得到了错误: 例如,这里是链接按钮的功能。 (我有一个带有2个列表框的gui。一个显示GPO,一个显示OU(ou显示为CanonicalName而不是Distinguishedname,因此$ SWITCH变量来回移动,以便用户以更友好的方式查看它) )

function LinkFn {
$ResultsTextBox.clear()
#This $SWITCH is used to Translate the user selection from the OU listbox from canonical back to distinguishedname 
$SWITCH = Get-ADOrganizationalUnit -filter *  -Property CanonicalName | Where-Object {$_.CanonicalName -eq $listBox2.SelectedItem}

    ForEach ($line in $listBox1.selecteditems){
         try {
             Invoke-Command -ComputerName "$DCNAME" -ScriptBlock {New-GPlink -name $line -target $SWITCH -ErrorAction STOP | Out-null}
             $ResultsTextBox.AppendText("`n GPO: $line HAVE BEEN LINKED Successfully.`n") 
            }
            catch{
            $ResultsTextBox.AppendText("`n$line ALREADY LINKED! TO THIS OU `n")
    }}}

有人可以帮忙吗?

从我看来,我认为代码行存在问题:

$SWITCH = Invoke-Command -ComputerName "$DCNAME" -ScriptBlock {Get-ADOrganizationalUnit -filter *  -Property CanonicalName | Where-Object {$_.CanonicalName -eq $listBox2.SelectedItem}}

$ switch空了(在DC上运行正常),为什么?

评论
  • 回眸醉倾城
    回眸醉倾城 回复

    write your try catch block like below. You have to use $using:variable to use the variables declared outside of the scriptblock.;

    try {
        Invoke-Command -ComputerName "$DCNAME" -ScriptBlock {New-GPlink -name $using:line -target $using:SWITCH -ErrorAction STOP | Out-null}
        $ResultsTextBox.AppendText("`n GPO: $line HAVE BEEN LINKED Successfully.`n") 
    }
    catch{
        $ResultsTextBox.AppendText("`n$line ALREADY LINKED! TO THIS OU `n")
    }
    

    同样,如果用户无权连接到DC或远程连接到DC,则将无法工作。运行脚本的用户将需要对DC的管理员级别访问权限,或者对实际具有访问权限的帐户使用凭据。