我一直在研究一个问题,我能够以相对体面和可接受的方式完成我需要做的事情,但我很好奇为什么我遇到了一些我遇到的问题。
我对PowerShell或C#不太了解,但我对Java,C ++和其他一些人有一些经验。所以,如果我忽略了一些非常简单的事情,你就必须原谅我。我不是在寻找对我的解决方案的批评,只是对我遇到的一些封锁有所了解。
我需要做的是使用Powershell查询LDAP设置。我需要知道MaxConnIdleTime,我需要分配给变量或通过子程序[sic](ex $ ldapPolicies.MaxConnIdleTime)访问,以便我可以通过条件语句运行它。
以下是我如何完成它:
$ldap = Get-ADObject -SearchBase "CN=Query-Policies,CN=Directory
Service,CN=Windows
NT,CN=Services,CN=Configuration,DC=$ENV:COMPUTERNAME,DC=$dc" -Filter
'ObjectClass -like "queryPolicy"' -Properties ldapadminlimits
$ldap = @($ldap.ldapadminlimits)
$ldap | %{
if($_.startswith("MaxConnIdleTime")) {
$match = $_
}
}
我尝试过NTDSUtil.exe,但是,我无法重定向"显示值"到一个文本文件,以便稍后阅读,我无法将其写入PowerShell中的变量。
我尝试了Start-Transcript,然后运行了NTDSUtil,但它只记录了PowerShell中发生的事情,而不是NTDSUtil中发生的事情。
此外,我尝试将所有命令一次性提供给NTDSUtil(NTDSUtil" ldap policies"" connections""连接到服务器$ ENV:COMPUTERNAME" q "显示值")但PowerShell在控制台中没有显示任何内容,我按下退出序列返回PS&gt ;.
我知道我可以使用LDP,但我对ADSI不太熟悉。研究似乎表示,尝试获得LDPdump有点过时,我几乎放弃了这种尝试。
我遇到的一个问题让我有点沮丧(我问这个问题的原因)是为什么我不能搜索数组并使用通配符找到项目的索引?我试过这样做:
$ldap.IndexOf("MaxConnIdleTime*")
和
$ldap.IndexOf($ldap -like "MaxConnIdleTime*")
但它总是返回-1。
如果我尝试,它会正常工作:
$ldap.IndexOf("MaxConnIdleTime=100")
鉴于该值确实为100.但我确认该值是正确的。
我知道我可以做这样的事情:
if($ldap -contains "MaxConnIdleTime=100") {
DO SOMETHING...
} else {
DO SOMETHING ELSE...
}
为什么我无法使用通配符运算符搜索数组?没有歧义,所以,它应该有效,对吗?
我不是在寻找对我如何实现这一目标的批评,我只是想了解它为什么会这样做。
感谢。
答案 0 :(得分:0)
我不认为在PowerShell中有一个简单的“通过通配符搜索数组并返回索引”cmdlet,方法,语句等。
.IndexOf
不适用于通配符。
当您在数组上使用-like
运算符时,您可能只找到一个匹配对象,但-like
在数组上使用时会返回匹配数组。
将数组传递给.IndexOf()
然后查找一个本身就是数组的数组元素,即使该数组只有一个对象。
这样可行:
$ldap.IndexOf(($ldap -like "MaxConnIdleTime*")[0])
只要你一直想找到第一个。