Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 使用筛选数组调用PutEx时出错_Powershell_Active Directory_Adsi - Fatal编程技术网

Powershell 使用筛选数组调用PutEx时出错

Powershell 使用筛选数组调用PutEx时出错,powershell,active-directory,adsi,Powershell,Active Directory,Adsi,如果我在PowerShell中的adsi对象上调用PutEx,则一切正常: $values = @("xyz", "abc" ) $user = [adsi]"LDAP://CN=someone,CN=Users,DC=acme,DC=com" $user.PutEx($ADS_PROPERTY_DELETE, "altsecurityidentities", $values) $user.SetInfo() 然而,如果我做同样的事情,但使用Where Object过滤值,我会得到一个错误:

如果我在PowerShell中的
adsi
对象上调用
PutEx
,则一切正常:

$values = @("xyz", "abc" )
$user = [adsi]"LDAP://CN=someone,CN=Users,DC=acme,DC=com"
$user.PutEx($ADS_PROPERTY_DELETE, "altsecurityidentities", $values)
$user.SetInfo()
然而,如果我做同样的事情,但使用
Where Object
过滤值,我会得到一个错误:

$values = @("xyz", "abc" )
$filtered = @($values | ? { $_.startsWith("x") })
$user = [adsi]"LDAP://CN=someone,CN=Users,DC=acme,DC=com"
$user.PutEx($ADS_PROPERTY_DELETE, "altsecurityidentities", $filtered)
$user.SetInfo()
错误是:
调用带有“3”参数的“PutEx”时发生异常:“未指定错误”


这两种情况的区别是什么?

如果您尝试按如下方式迭代
$filtered
对象,该怎么办:

$values = @("xyz", "abc" )
$filtered = @($values | ? { $_.startsWith("x") })
foreach($item in $filtered){
    $user = [adsi]"LDAP://CN=someone,CN=Users,DC=acme,DC=com"
    $user.PutEx($ADS_PROPERTY_DELETE, "altsecurityidentities", $item)
    $user.SetInfo()
}

您的代码似乎没有失败的原因

我唯一的疑问是,它是否需要一个字符串数组,因为我检查的所有示例似乎都表明了这一点。如果您尝试:

$filtered = [String[]]($values | ?{$_.StartsWith("x")})
$filtered.GetType().fullname
System.String[]
看看这是怎么回事


PS:现在还不能发表评论,所以不得不添加回复。

我看到的两个示例之间的唯一区别是,第一个示例尝试删除“xyz”和“abc”的“alt安全标识”,而第二个示例尝试删除“xyz”的两个“alt安全标识”。两个参数都是object[],所以我看不到问题!我也看不到问题,但一个有效,另一个无效:)顺便问一下,为什么第二个要尝试删除两个AltSecurityIdentity?这不应该是一个只有一个值的数组吗?对不起,我提错了方向!你是对的,第二个应该给你一个只有一个值的数组。只是出于兴趣,如果将过滤后的值放入两次会发生什么情况?
$item
实际上应该是
@($item)
,因为
PutEx
需要一个数组。这也不起作用。不过,我正在使用类似的解决方法,但我真的想尝试理解出现此奇怪错误的原因。
$filtered = [String[]]($values | ?{$_.StartsWith("x")})
$filtered.GetType().fullname
System.String[]