运行 远程 ps 命令
running remotely ps commands
我写了一个像 gpo 编辑器一样的脚本,它可以获取一些 GPO 和 OU,并 link 它们或取消 link 它们,具体取决于用户的意愿。现在这个脚本在域控制器机器上 运行ning 时确实有效,但我需要它在域上的 windows 10 机器工作站上 运行。所以我需要在向用户显示 GUI 时进行调整,所有代码都必须调用 dc 上的命令。我不知道是什么问题,但是当我一个一个地手动输入命令时,它起作用了,当它作为脚本 运行ning 时,我得到错误:
例如,这里有一个 link 按钮的函数。 (我有一个带有 2 个列表框的图形用户界面。一个显示 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 变空了(在直流电上 运行 没问题),知道为什么吗?
像下面这样写你的 try catch 块。您必须使用 $using:variable
才能使用在脚本块外部声明的变量。;
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 的管理员级别访问权限或使用实际具有访问权限的帐户的凭据。
我写了一个像 gpo 编辑器一样的脚本,它可以获取一些 GPO 和 OU,并 link 它们或取消 link 它们,具体取决于用户的意愿。现在这个脚本在域控制器机器上 运行ning 时确实有效,但我需要它在域上的 windows 10 机器工作站上 运行。所以我需要在向用户显示 GUI 时进行调整,所有代码都必须调用 dc 上的命令。我不知道是什么问题,但是当我一个一个地手动输入命令时,它起作用了,当它作为脚本 运行ning 时,我得到错误: 例如,这里有一个 link 按钮的函数。 (我有一个带有 2 个列表框的图形用户界面。一个显示 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 变空了(在直流电上 运行 没问题),知道为什么吗?
像下面这样写你的 try catch 块。您必须使用 $using:variable
才能使用在脚本块外部声明的变量。;
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 的管理员级别访问权限或使用实际具有访问权限的帐户的凭据。