此功能应在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
}
答案 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)
观察和假设
根据代码做出了一些假设。
基于传递$ 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