尝试使用 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 '"')
存在的原因
我知道这已经使用 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 '"')
存在的原因