尝试使用 dsquery 使用 Powershell 禁用不活动的 AD 计算机

Trying to disable inactive AD Computers using Powershell using dsquery

我知道这已经使用 Get-AdComputer 完成了一千次,但我正在尝试使用 dsquery 和管道来完成。我想将查询限制为单父 OU。这是我得到的:

dsquery computer "OU=Workstations,OU=Domain Computers,DC=Contoso,DC=local" -o dn -inactive 4

不出所料,这给了我一个计算机识别名列表。 Move-Object 只能采用专有名称或 GUID。我是这样输出的:

dsquery computer "OU=Workstations,OU=Domain Computers,DC=Contoso,DC=local" -o dn -inactive 4 | Move-ADObject -TargetPath "OU=4WEEKS,OU=Decommissioned,OU=Domain Computers,DC=Contoso,DC=local"

我收到每个专有名称的以下错误:

Move-ADObject : Cannot find an object with identity: '"CN=COMPUTER1,OU=TEST,OU=Workstations,OU=Domain Computers,DC=Contoso,DC=local"' under: 'DC=contoso,DC=local'.

然后我尝试通过 GUID 移动它们:

weeks = dsquery computer "OU=Workstations,OU=Domain Computers,DC=contoso,DC=local" -o rdn -inactive 4

此命令显示 GUID 列表:

weeks.replace("`"","") | Get-ADComputer -properties * | select Objectguid |

然后我像这样管道:

weeks.replace("`"","") | Get-ADComputer -properties * | select Objectguid | Move-ADObject -TargetPath "OU=4WEEKS,OU=Decommissioned,OU=Domain Computers,DC=contoso,DC=local"

而且我没有正确传递 Identity 参数。

Move-ADObject : Cannot validate argument on parameter 'Identity'. The Identity property on the argument is null or empty.

有什么建议吗?我有点新手。

谢谢!

如果您使用 dsquery 查找计算机,为什么不使用 dsmod/dsmove 来完成任务?

for /f %i in ('dsquery computer "OU=Workstations,OU=Domain Computers,DC=contoso,DC=local" -inactive 4') do (
    dsmod computer %i -disabled yes
    dsmove %i -newparent "OU=4WEEKS,OU=Decommissioned,OU=Domain Computers,DC=Contoso,DC=local"
)

注意要在批处理文件中使用它,您需要加倍 %

要回答您的具体问题,您需要在管道传输之前构造一个对象,因为 powershell 期望对象沿着管道下降。通过 Foreach-Object 循环

使用文本可能更容易
dsquery computer "OU=Workstations,OU=Domain Computers,DC=Contoso,DC=local" -o dn -inactive 4 | Foreach-Object {
    Move-ADObject -Identity ($_ -replace '"') -TargetPath "OU=4WEEKS,OU=Decommissioned,OU=Domain Computers,DC=Contoso,DC=local" -PassThru | 
        Set-ADComputer -Enabled $false
}

注意 dsquery加在识别名上的双引号需要去掉。这就是 -Identity ($_ -replace '"') 存在的原因