我正在尝试使用我编写的脚本的一部分来返回本地组列表,指定用户可能是远程服务器的一部分,因此可以从所述本地组中快速删除它们。一切似乎工作正常,直到一个人可能成为一部分的团体低于两个。当只有一个组时,我收到以下错误:
Cannot find an overload for "IndexOf" and the argument count: "2".
At line:177 char:30
+ [string]([array]::IndexOf <<<< ($localGroups, $_)+1) + ". " + $_
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
以下是我为这个特定脚本编写的函数......
此函数将返回给定用户所属的组列表:
function Get-LocalGroupAccess
{
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[string]$fqdn,
[Parameter(Mandatory=$true)]
[string]$userName
)
Process
{
$serverPath = [ADSI]"WinNT://$fqdn,computer"
$serverPath.PSBase.Children | where {$_.PSBase.SchemaClassName -eq 'group'} | foreach {
$lGroup = [ADSI]$_.PSBase.Path
$lGroup.PSBase.Invoke("Members") | foreach {
$lMember = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null).Replace("WinNT://","")
if ($lMember -like "$userName")
{
$localAccess += @($lGroup.Name)
}
}
}
return($localAccess)
}
}
此功能设置用户对象(我不确定这是技术术语):
function Set-UserObj($userDomain, $userName)
{
$userObj = [ADSI]"WinNT://$userDomain/$userName"
return ($userObj)
}
此函数设置FQDN(检查它是否可ping):
function Set-FQDN($fqdn)
{
do{
$fqdn = Read-Host "Enter the FQDN"
} while (-not(Test-Connection $fqdn -quiet))
return($fqdn)
}
此函数将选择要删除给定用户的组,将其更改为数组中的适当位置,然后返回组:
function Set-LocalGroup($localGroups, $selectGroup)
{
$selectGroup = Read-Host "What group would you like to add $userDomain/$userName to?"
$selectGroup = [int]$selectGroup -= 1
$setGroup = $localGroups[$selectGroup]
return($setGroup)
}
此函数设置Group对象(不确定这是否为技术术语):
function Set-GroupObj($fqdn, $group)
{
$groupObj = [ADSI]"WinNT://$fqdn/$group"
return($groupObj)
}
此功能从选定的组中删除给定用户:
function Remove-UserAccess ($gObj, $uObj)
{
$gObj.PSBase.Invoke("Remove",$uObj.PSBase.Path)
}
在脚本中请求用户名,域和FQDN。提供这些后,脚本将返回给定用户所属的组列表。一切正常,直到用户成为一个组的一部分。一旦发生这种情况,就会抛出我上面粘贴的错误。
请注意,这是我第一次发帖,我不确定这里需要哪些信息。我希望我提供了正确和正确的信息。如果没有,请告诉我你是否还需要其他东西。
谢谢!
答案 0 :(得分:1)
我回去看着我正在创建的变量$ localGroups中的区别(如果有的话)(我使用了Get-Member -InputObject $ localGroups)。我注意到,当$ localGroups只有一个项目时,它是一个System.String类型,但当它有多个项目时,它是一个System.Object []类型。我决定做以下事情,它解决了我遇到的问题:
$localGroups = @(Get-LocalGroupAccess $fqdn $userName)
上一个代码:
$localGroups = Get-LocalGroupAccess $fqdn $userName
一切正常,因为我强制变量为静态类型,而不是允许它创建它想要的任何类型。