Powershell 将用户添加到本地组

Powershell 将用户添加到本地组,powershell,Powershell,此功能应在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") $mem

此功能应在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

代码是:


为什么不在脚本中使用
netlocalgroup/add
,而不是那些看起来很糟糕的WMI?PowerShell是一个shell,而不是一个操作系统:)

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

参数绑定还是环境罪魁祸首

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

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


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

为什么要经历反思的痛苦,而PowerShell会为您这样做?例如:

$group = [ADSI]"WinNT://./Power Users,group"
$group.Add("WinNT://SYSTEM,user")
上面将系统本地帐户添加到本地超级用户组。我不知道为什么会出现上述特定错误,您也可以使用这种缩写语法来获得它。正在使用的特定COM接口是IADsGroup-此处的参考:


注意:由于您实际上正在使用.NET对象中包装的COM对象,因此最好在您使用完所有ADSI对象后对其调用
Dispose
方法。

观察和假设

有几个假设是基于代码做出的

  • 您只传递了一个带有两个值的参数对象。使用该语句
  • 以不同方式调用函数addUser2Group-user'MyGlobalMonitoringUser'-group'SomeDBGroup
  • 验证传递的参数。至少应检查它们是否为空/空
  • 只有在脚本运行之前为$group变量分配了一个值,这才有效
  • 基于传递$group变量值的错误参数仍然为空这一事实。然后,它导致代码的其余部分失败,始终返回$False的值


    建议的解决方案

    建议阅读:

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

    这是一份有效的代码副本

    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"
    

    只是在大约五年后添加一个更为更新的方法:

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

    您是否使用管理员权限运行脚本?我使用管理员权限从CMD.exe运行脚本(因为我总是要取消限制和重新限制Powershell脚本),您如何从CMD.exe调用它?您使用的确切命令行是什么?POWERSHELL.EXE“&“C:\Users\%USERNAME%\Desktop\servercheck.ps1”“”这主意不错,但没有帮助。为什么我可以从命令行运行,但不能从脚本运行?因为我已经说过了。。。它起作用了!我将尝试使用net local group+try..catch,但我仍然需要此选项的答案:>net local group也会失败。顺便说一句:使用acl设置权限也会失败。是的,我确信我是以管理员的身份运行它的!听起来您有不同的问题(即不是powershell),如果“net localgroup”也失败了。您需要将脚本减少到故障的最小复制。另外,您在每个系统上运行的powershell版本是什么?哪些版本失败?全部的只有一个?什么都不运行,但是这个命令失败了。一行脚本。我在每台服务器上运行PS2.0,脚本在所有服务器上都失败。Windows安装完全相同(所有安装的映像都相同),您是通过powershell远程处理运行此安装,还是通过远程桌面直接在服务器上运行此安装?另外,net localgroup究竟是如何失败的?错误信息是什么?谢谢你的帮助。我不知道,但不知怎么的,我找不到这个简单的解决办法。但我已经试过了(见其他答案)。它在脚本中也会失败,但在从命令行执行时可以工作。对不起,我添加了代码。你可以说这只是那一行,所以我认为不需要它;)
    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"
    
    $group = Get-LocalGroup SomeDBGroup
    $user = Get-LocalUser MyGlobalMonitoringUser
    Add-LocalGroupMember $group $user