将用户添加到本地组

时间:2012-12-18 09:34:06

标签: powershell

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

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 个答案:

答案 0 :(得分: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对象,所以最好在完成它们时创建的任何ADSI对象上调用Dispose方法。

答案 1 :(得分:1)

观察和假设

根据代码做出了一些假设。

  1. 您只传递了一个带有两个值的参数对象。使用Param声明
  2. 以不同方式调用该函数 addUser2Group -user'MyGlobalMonitoringUser'-group“SomeDBGroup”
  3. 验证传递的参数。至少应检查它们为空/空。
  4. 只有在脚本运行之前为$ group变量分配了值时才会这样做。
  5. 基于传递$ group变量值的错误参数保持为空的事实。然后它导致其余代码失败,总是返回$ False的值。


    建议的解决方案

    推荐阅读: Simplify your PowerShell Script with Parameter Validation

    在函数中包含参数“switch” 改变你调用函数的方式。

    这是有效代码的副本。

    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"
    

答案 2 :(得分:0)

  

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

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

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

  

检索成员“添加”

时发生以下异常

显然/add标志没有被正确设置,因为它被解释为成员名称,但由于没有提供代码,所以不能说明原因。

答案 3 :(得分:0)

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

$group = Get-LocalGroup SomeDBGroup
$user = Get-LocalUser MyGlobalMonitoringUser
Add-LocalGroupMember $group $user