使用 Powershell 在任务序列期间将计算机添加到多个 Active Directory 组
Adding Computer to Multiple Active Directory Groups During Task Sequence Using Powershell
我正在尝试为 SCCM 设置我的任务序列,以自动将笔记本电脑添加到 3 个 Active Directory 组。我已经设置了执行此操作的步骤,并且正在调用 Powershell 脚本来执行此操作。该脚本应该是 运行 作为网络管理员,所以我不认为我在授权方面有任何问题,但是我是 Powershell 的超级新手,所以我相信我的问题出在我的语法上。我的脚本非常简单,我查看的所有资源似乎都使 Powershell 过于复杂,无法满足我的需要。这是我的脚本:
ADD-ADGroupMember "GroupOne" -members "$env:computername$"
ADD-ADGroupMember "GroupTwo" -members "$env:computername$"
ADD-ADGroupMember "GroupThree" -members "$env:computername$"
我发现 $env:computername 应该自动收集在任务序列中较早建立的计算机名称,并且需要使用 powershell 添加后面的 $。
如有任何帮助,我们将不胜感激。
编辑:我终于让它工作了,下面是我找到并用于其中一个 powershell 脚本的代码 -
$ComputerName = gc env:computername
$isMember = new-object DirectoryServices.DirectorySearcher([ADSI]"")
$ismember.filter = “(&(objectClass=computer)(sAMAccountName=$Computername$)(memberof=CN=<CN NAME>,OU=<OU NAME>,DC=<DC NAME>,DC=<DC NAME>))”
$isMemberResult = $isMember.FindOne()
If ($isMemberResult) {exit}
else
{
$searcher = new-object DirectoryServices.DirectorySearcher([ADSI]"")
$searcher.filter = “(&(objectClass=computer)(sAMAccountName= $Computername$))”
$FoundComputer = $searcher.FindOne()
$P = $FoundComputer | select path
$ComputerPath = $p.path
$GroupPath = "LDAP://CN=<CN NAME>,OU=<OU NAME>,DC=<DC NAME>,DC=<DC NAME>"
$Group = [ADSI]"$GroupPath"
$Group.Add("$ComputerPath")
$Group.SetInfo()
}
与其尝试从环境变量中组成计算机的帐户名,然后使用它添加到组中,不如从 Active Directory 中获取计算机对象:
$Computer = Get-ADComputer -Identity $env:ComputerName
foreach ($Group in @("GroupOne", "GroupTwo", "GroupThree")) {
Add-ADGroupMember -Identity $Group -Members $Computer
}
因为您提到您没有可用的 AD cmdlet。以下是使用 ADSI 的方法:
$filter = "(&(objectCategory=computer)(objectClass=computer)(cn=$env:COMPUTERNAME))"
$ComputerDN = ([adsisearcher]$filter).FindOne().Properties.distinguishedname
$GroupName = "GroupOne"
$filter = "(&(objectClass=Group)(cn=$GroupName))"
$GroupDN = ([adsisearcher]$filter).FindOne().Properties.distinguishedname
$Group = [adsi]"LDAP://$GroupDN"
$Group.Add($ComputerDN)
$GroupName = "GroupTwo"
$filter = "(&(objectClass=Group)(cn=$GroupName))"
$GroupDN = ([adsisearcher]$filter).FindOne().Properties.distinguishedname
$Group = [adsi]"LDAP://$GroupDN"
$Group.Add($ComputerDN)
$GroupName = "GroupThree"
$filter = "(&(objectClass=Group)(cn=$GroupName))"
$GroupDN = ([adsisearcher]$filter).FindOne().Properties.distinguishedname
$Group = [adsi]"LDAP://$GroupDN"
$Group.Add($ComputerDN)
如果你有更多的组,它可能值得变成一个函数。
只需确保无论用户上下文是什么 运行,它都有权向该组添加成员。
我正在尝试为 SCCM 设置我的任务序列,以自动将笔记本电脑添加到 3 个 Active Directory 组。我已经设置了执行此操作的步骤,并且正在调用 Powershell 脚本来执行此操作。该脚本应该是 运行 作为网络管理员,所以我不认为我在授权方面有任何问题,但是我是 Powershell 的超级新手,所以我相信我的问题出在我的语法上。我的脚本非常简单,我查看的所有资源似乎都使 Powershell 过于复杂,无法满足我的需要。这是我的脚本:
ADD-ADGroupMember "GroupOne" -members "$env:computername$"
ADD-ADGroupMember "GroupTwo" -members "$env:computername$"
ADD-ADGroupMember "GroupThree" -members "$env:computername$"
我发现 $env:computername 应该自动收集在任务序列中较早建立的计算机名称,并且需要使用 powershell 添加后面的 $。
如有任何帮助,我们将不胜感激。
编辑:我终于让它工作了,下面是我找到并用于其中一个 powershell 脚本的代码 -
$ComputerName = gc env:computername
$isMember = new-object DirectoryServices.DirectorySearcher([ADSI]"")
$ismember.filter = “(&(objectClass=computer)(sAMAccountName=$Computername$)(memberof=CN=<CN NAME>,OU=<OU NAME>,DC=<DC NAME>,DC=<DC NAME>))”
$isMemberResult = $isMember.FindOne()
If ($isMemberResult) {exit}
else
{
$searcher = new-object DirectoryServices.DirectorySearcher([ADSI]"")
$searcher.filter = “(&(objectClass=computer)(sAMAccountName= $Computername$))”
$FoundComputer = $searcher.FindOne()
$P = $FoundComputer | select path
$ComputerPath = $p.path
$GroupPath = "LDAP://CN=<CN NAME>,OU=<OU NAME>,DC=<DC NAME>,DC=<DC NAME>"
$Group = [ADSI]"$GroupPath"
$Group.Add("$ComputerPath")
$Group.SetInfo()
}
与其尝试从环境变量中组成计算机的帐户名,然后使用它添加到组中,不如从 Active Directory 中获取计算机对象:
$Computer = Get-ADComputer -Identity $env:ComputerName
foreach ($Group in @("GroupOne", "GroupTwo", "GroupThree")) {
Add-ADGroupMember -Identity $Group -Members $Computer
}
因为您提到您没有可用的 AD cmdlet。以下是使用 ADSI 的方法:
$filter = "(&(objectCategory=computer)(objectClass=computer)(cn=$env:COMPUTERNAME))"
$ComputerDN = ([adsisearcher]$filter).FindOne().Properties.distinguishedname
$GroupName = "GroupOne"
$filter = "(&(objectClass=Group)(cn=$GroupName))"
$GroupDN = ([adsisearcher]$filter).FindOne().Properties.distinguishedname
$Group = [adsi]"LDAP://$GroupDN"
$Group.Add($ComputerDN)
$GroupName = "GroupTwo"
$filter = "(&(objectClass=Group)(cn=$GroupName))"
$GroupDN = ([adsisearcher]$filter).FindOne().Properties.distinguishedname
$Group = [adsi]"LDAP://$GroupDN"
$Group.Add($ComputerDN)
$GroupName = "GroupThree"
$filter = "(&(objectClass=Group)(cn=$GroupName))"
$GroupDN = ([adsisearcher]$filter).FindOne().Properties.distinguishedname
$Group = [adsi]"LDAP://$GroupDN"
$Group.Add($ComputerDN)
如果你有更多的组,它可能值得变成一个函数。
只需确保无论用户上下文是什么 运行,它都有权向该组添加成员。