【发布时间】:2015-03-02 18:51:28
【问题描述】:
我正在研究使用 Powershell 将安全设置从一台服务器复制到另一台服务器的最简单方法,我很好奇是否可以导入整个组,包括它的 Description 和 Members 属性?
以下是我目前拥有的脚本。看来我可以使用ADSI 适配器访问远程服务器上的本地组,但是Create 命令会出现以下错误消息
使用“2”参数调用“创建”的异常:“类型不匹配。(来自 HRESULT 的异常:0x80020005 (DISP_E_TYPEMISMATCH))” 在 \prdhilfs02\install\Monet\ServerUpgrade\DEVHILWB119\Scripts\LocalUsersAndGroups.ps1:25 char:1+ $objCreate = $cn.Create("Group", $objRemote)
$computerName = "DEVWB89"
$objRemote = [ADSI]("WinNT://$computerName/$groupName")
$cn = [ADSI]"WinNT://localhost"
$cn.Create("Group", $objRemote)
编辑
所以我可以使用下面的脚本来完成我想要的。我可以使用远程服务器中的组名称和描述以及组信息。但是,有没有办法使用 Powershell 将 System.DirectoryServices.DirectoryEntry 对象及其所有属性简单地添加到本地计算机?另外,另一个缺点是我必须为组的用户对域进行硬编码。
$cn = [ADSI]"WinNT://localhost"
$computerName = "DEVWB89"
foreach($groupName in $groupArray)
{
$objRemote = [ADSI]("WinNT://$computerName/$groupName")
$objGroup = $cn.Create("Group", $($objRemote.Name))
$objGroup.setinfo()
$objGroup.description = $objGroup.Description
$objGroup.setinfo()
$Members = @($objRemote.psbase.Invoke("Members"))
$Members | ForEach-Object {$MemberNames += $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) + ",";}
$tempArray = $MemberNames -split ","
foreach($member in $tempArray)
{
$objGroup.Add("WinNT://SYMETRA/$member, user")
}
}
【问题讨论】:
-
开始 Create() 可能需要一个字符串,而不是
System.DirectoryServices.DirectoryEntry,这就是$objRemote -
是的,我想通了。你知道是否可以使用
System.DirectoryServices.DirectoryEntry“对象”来创建一个本地组。如果可能和/或语法是什么? -
$cn.Create("Group", $objRemote.Name)可能会组成该组,但不会包含您要查找的详细信息。$objRemote.Description有描述,我不确定成员列表在哪里或是否可用。 -
太棒了,我会继续寻找。谢谢!
-
blogs.technet.com/b/heyscriptingguy/archive/2013/10/27/… 如果有帮助的话。如果机器是域成员,这可以解决您可能遇到的一些问题
标签: powershell