我想运行一个 powershell 脚本来从不在域中的机器查询 AD。
基本上,我想查询该计算机是否已在域中存在计算机帐户,如果没有,则创建该帐户。因为这必须在计算机加入域之前发生,所以我假设我需要指定一些凭据才能使其运行。(我对 Powershell 还很陌生,所以如果这是一个新手问题,请原谅!)
我用来检查帐户的脚本如下,一旦运行,它将使用指定的计算机名加入域。
您能告诉我如何指定一些域凭据来运行此部分脚本吗?
干杯,
本
$found=$false
$thisComputer = <SERVICE TAG FROM BIOS>
$ou = [ADSI]"LDAP://OU=My Computer OU,DC=myDomain,DC=com"
foreach ($child in $ou.psbase.Children ) {
if ($child.ObjectCategory -like '*computer*') {
If ($child.Name -eq $thisComputer) {
$found=$true
}
}
}
If ($found) { <DELETE THE EXISTING ACCOUNT> }
答案1
据我所知,没有办法使用 ADSI 类型加速器传递备用凭据。您可以尝试在代码中解决这个问题的两种方法是:
- 让 powershell.exe 以域用户而不是本地用户的身份运行 - 这将导致脚本中的所有内容使用域凭据
- 使用
Invoke-Command
cmdlet,它允许您传入要执行的脚本块和备用凭据。
我从来没有尝试过这两种方法,因此需要进行一些反复试验。
另一个对您来说更灵活的选择是不使用 ADSI 类型的加速器。有两种方法可以实现这一点。
- 使用.NET 框架
DirectoryService
类。这是一篇好文章引导您完成此过程。其中包括使用备用凭据的示例。 - 使用Quest Active Directory 管理cmdlet。这些是许多 AD 内容的包装器,可使很多事情变得更容易。它们还允许您传递备用凭据。
答案2
抱歉-这实际上应该是一条评论,而不是答案,但我想发布工作代码以防其他人有用。
MattB 真是太有才了!以下是工作内容:
$thisComputer = <SERVICE TAG FROM BIOS>
$found = $false
$strFilter = "(&(objectCategory=Computer))"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry "LDAP://mydomain.com", <USER>, <PASSWORD>
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = "Subtree"
$colProplist = "name"
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
$colResults = $objSearcher.FindAll()
foreach ($objResult in $colResults)
{$objItem = $objResult.Properties;
if ($objItem.name -eq $thisComputer) {
$found = $true
}
}
if ($found) { <DELETE MACHINE ACCOUNT > }
现在我已经证明了这个概念,将加密密码以使其更安全一些。
感谢您的帮助!
答案3
您可以通过添加以下行来继续使用 [ADSI] 加速器并传递凭据:
获取凭证
这应该是您脚本中的第一件事。在我自己的环境中,我需要编写一个脚本来连接到不同的域。对于该不同的域,我拥有不同的凭据,因此编写以下内容使我能够完成我需要做的事情:
获取凭据导入 csv test.csv | foreach { $ou = [ADSI]"LDAP://ou=users,dc=test,dc=com" $newuser = $ou.Create("User", "cn=$name" $newuser.SetInfo()
我知道上述代码用于创建用户,但这个概念也适用于任何其他操作
答案4
看起来你不再需要它了,但是这里是关于如何创建 PowerShell 凭据的链接。