2

此功能应在 Windows Server 2003 和 2008 R2 上运行 使用命令行逐行执行它是成功的!脚本执行失败。

function addUser2Group([string]$user,[string]$group)
{    
    $cname = gc env:computername
    $objUser = [ADSI]("WinNT://$user")
    $objGroup = [ADSI]("WinNT://$cname/$group,group")  
    $members = $objGroup.PSBase.Invoke('Members')
    $found = $false

    foreach($m in $members)
    {
        if($m.GetType().InvokeMember('Name', 'GetProperty', $null, $m, $null) -eq $user)
        {
            $found = $true
        }
    }

    if(-not $found)
    {
        $objGroup.PSBase.Invoke('Add',$objUser.PSBase.Path)
    }

    $members = $objGroup.PSBase.Invoke('Members')
    $found = $false
    foreach($m in $members)
    {
        if($m.GetType().InvokeMember('Name', 'GetProperty', $null, $m, $null) -eq $user)
        {
            $found = $true
        }
    }

    return $found
}

addUser2Group('MyGlobalMonitoringUser',"SomeDBGroup")

它应该将用户添加到本地组。但它只会给我以下错误:

Exception calling "Invoke" with "2" argument(s): "Unknown error (0x80005000)"
+     $members = @($objGroup.PSBase.Invoke <<<< ("Members"))
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException





编辑: /add 出现的错误消息是

The following exception occurred while retrieving member "Add": "Unknown error (0x80005000)"


代码是:

function addUser2Group([string]$user,[string]$group)
{
    $cname = gc env:computername
    try
    {
        ([adsi]"WinNT://$cname/$group,group").Add("WinNT://$cname/$user,user")
    }
    catch
    {
        write2log($_)
        return $false
    }

    return $true
}
4

5 回答 5

14

当 PowerShell 为您完成时,为什么还要经历反思的痛苦?例子:

$group = [ADSI]"WinNT://./Power Users,group"
$group.Add("WinNT://SYSTEM,user")

以上将 SYSTEM 本地帐户添加到本地 Power Users 组。我不确定您为什么会收到上面的特定错误,您也可以使用这种缩写语法得到它。正在使用的特定 COM 接口是 IADsGroup - 在此处参考:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa706021.aspx

注意:因为您实际上是在使用包装在 .NET 对象中的 COM 对象,所以最好在Dispose使用完它们后创建的任何 ADSI 对象上调用该方法。

于 2013-01-10T16:15:42.853 回答
2

你为什么不在你net localgroup /add的脚本中使用那些看起来很讨厌的 WMI 呢?PowerShell 是一个外壳,而不是一个操作系统 :)

于 2012-12-19T12:20:35.000 回答
1

观察和假设

有几个基于代码的假设。

  1. 您只传递了一个具有两个值的参数对象。使用参数语句
  2. 以不同方式调用函数addUser2Group -user 'MyGlobalMonitoringUser' -group "SomeDBGroup"
  3. 验证传递的参数。至少应该检查它们是否为空/空。
  4. 仅当您在脚本运行之前为 $group 变量分配了一个值时,这才有效。

基于传递 $group 变量值的错误参数仍然为空的事实。然后它导致其余代码失败,总是返回 $False 的值。


建议的解决方案

推荐阅读: 使用参数验证简化您的 PowerShell 脚本

在函数中包含参数“开关” 更改调用函数的方式。

这是有效的代码副本。

function addUser2Group
{   
    # Added the Param Switch 
    Param(
        [string]$user,
        [string]$group
    )

    $cname = gc env:computername
    $objUser = [ADSI]("WinNT://$user")
    $objGroup = [ADSI]("WinNT://$cname/$group,group")
    #$members = $objGroup.Invoke('Members')
    $found = $false

    foreach($m in $members)
    {
        if($m.GetType().InvokeMember('Name', 'GetProperty', $null, $m, $null) -eq $user)
        {
            $found = $true
        }
    }

    if(-not $found)
    {
        $objGroup.PSBase.Invoke('Add',$objUser.PSBase.Path)
    }

    $members = $objGroup.PSBase.Invoke('Members')
    $found = $false
    foreach($m in $members)
    {
        if($m.GetType().InvokeMember('Name', 'GetProperty', $null, $m, $null) -eq $user)
        {
            $found = $true
        }
    }

    return $found
}

addUser2Group -user 'testing' -group "Administrators"
于 2014-03-01T16:42:18.577 回答
0

•0x80005000(“指定的目录服务属性或值不存在”)。

也许是参数绑定或环境罪魁祸首?

至于 net localgroup 的问题:仔细检查错误信息:

检索成员“添加”时发生以下异常

显然,该/add标志未正确设置,因为它被解释为成员名称,但由于未提供代码,因此无法说明原因。

于 2013-01-10T15:33:31.347 回答
0

大约五年后添加一个更新的方法:

$group = Get-LocalGroup SomeDBGroup
$user = Get-LocalUser MyGlobalMonitoringUser
Add-LocalGroupMember $group $user
于 2018-06-16T10:35:54.250 回答