Powershell 将用户添加到本地组
此功能应在Windows Server 2003和2008 R2上运行 使用命令行逐行执行成功!脚本执行失败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
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
方法。观察和假设
有几个假设是基于代码做出的
建议的解决方案 建议阅读: 在函数中包括参数“开关” 更改调用函数的方式 这是一份有效的代码副本
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