我有一个脚本,我需要找到它运行的计算机的完整专有名称(CN=MyComputer, OU=Computers, DC=vw, DC=local
),但我无法保证所有计算机上都可以使用ActiveDirectory
模块将运行此脚本。有没有办法在不使用Get-ADComputer $Env:COMPUTERNAME
的情况下获取当前计算机的完整专有名称?
如果这是一个XY问题,我想要做的是将计算机移动到特定的OU,但我需要一种方法来获取我正在运行的计算机的ASDI条目。
[ADSI]$computer = ("LDAP://" + $localDN)
if($Production)
{
[ADSI]$destination = 'LDAP://ou=Production,ou=Computers,ou=VetWeb,dc=vw,dc=local'
$computer.MoveTo($destination);
}
else
{
[ADSI]$destination = 'LDAP://ou=Test,ou=Computers,ou=VetWeb,dc=vw,dc=local'
$computer.MoveTo($destination);
}
答案 0 :(得分:10)
试试这个(需要v2):
$filter = "(&(objectCategory=computer)(objectClass=computer)(cn=$env:COMPUTERNAME))"
([adsisearcher]$filter).FindOne().Properties.distinguishedname
答案 1 :(得分:4)
cmdlet Get-ADComputer(PS ver 2.0)可以提供帮助。
PS:\> $(Get-ADComputer 'mycomputer').distinguishedName
计算机名称应为短名称,例如$ env:COMPUTERNAME。
答案 2 :(得分:2)
小心使用ADSIsearcher方法。如果在同一个林中的不同域中有两台具有相同名称的计算机(导致我执行返回本文的搜索的问题),则不保证此方法返回正确的计算机。此方法将在AD中搜索具有ComputerName环境变量返回的名称的计算机。如果您处于林中具有多个域的环境中,则需要确保交叉引用计算机所加入的域。
主持人,这应该是Shay Levy对答案的评论,但我不能发表评论,因为我是新人。
答案 3 :(得分:0)
尝试这样的事情:
$de = New-Object System.DirectoryServices.DirectoryEntry
$ds = New-Object System.DirectoryServices.DirectorySearcher
$ds.SearchRoot = $de
$ds.Filter = "(&(objectCategory=computer)(objectClass=computer)(samAccountName=$($env:ComputerName)$))"
$ds.SearchScope = "SubTree"
$r = $ds.FindOne()
$r.Path
答案 4 :(得分:0)
试试这个......易于理解,易于记忆......
$cn = Read-Host
“输入ComputerName”
$cnObj = Get-ADComputer $cn
$ou = $cnObj.distinguishedname
$ou
答案 5 :(得分:0)
我知道找到计算机的DistinguishedName的唯一确定的方法是必须以管理员身份运行的以下内容:
gpresult /r /scope:computer | find "CN="
答案 6 :(得分:0)
Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\DataStore\Machine\0" -Name "DNName"
答案 7 :(得分:-1)
我认为你可以通过使用以下方式从环境中获取它:
$computer = gc env:computername
或者这正是你不想要的?对于powershell,我很糟糕。