在PowerShell中获取当前计算机的可分辨名称,而不使用ActiveDirectory模块

时间:2012-06-21 20:30:58

标签: powershell active-directory

我有一个脚本,我需要找到它运行的计算机的完整专有名称(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);
}

8 个答案:

答案 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,我很糟糕。