Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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 |加快运行速度在Powershell作业中获得ADUser_Powershell_Active Directory_Start Job - Fatal编程技术网

Powershell |加快运行速度在Powershell作业中获得ADUser

Powershell |加快运行速度在Powershell作业中获得ADUser,powershell,active-directory,start-job,Powershell,Active Directory,Start Job,我正在开发一个工具,可以快速运行csv并搜索广告中提供的相关信息 我制作了一个gui,可以让用户将CSV的标题与广告搜索方法对齐 我目前的主要问题是,在搜索EmailAddress变量的广告时,经常会出现错误 与处理请求的目录的连接不可用。这可能是一种暂时的情况 它在选择条目时出错 限制一次运行的powershell作业的数量似乎有助于解决此问题 但并没有完全消除它 这就是我目前正在处理的问题 $maxConcurrentJobs=15 $CheckBlock = { p

我正在开发一个工具,可以快速运行csv并搜索广告中提供的相关信息 我制作了一个gui,可以让用户将CSV的标题与广告搜索方法对齐

我目前的主要问题是,在搜索EmailAddress变量的广告时,经常会出现错误 与处理请求的目录的连接不可用。这可能是一种暂时的情况

它在选择条目时出错 限制一次运行的powershell作业的数量似乎有助于解决此问题 但并没有完全消除它

这就是我目前正在处理的问题

$maxConcurrentJobs=15
$CheckBlock = {
            param ($User)
            Try { Get-ADUser -Filter { EmailAddress -eq $User } -Properties SamAccountName, EmployeeID, EmailAddress }
            Catch { Return "$User - $_" }
        }
        $Array.($listbox_Columns.SelectedItem) | ForEach-Object{
            $Check = $false 
            while ($Check -eq $false)
            {
                if ((Get-Job -State 'Running').Count -lt $maxConcurrentJobs)
                {
                    Write-Host "Processing EmailAddress $_"
                    Start-Job -ScriptBlock $CheckBlock -ArgumentList $_
                    $Check = $true
                }
            }
        }
我建议改为-LDAPFilter,如下所示:

Get-ADUser -LDAPFilter "(mail=$User)" -Properties SamAccountName, EmployeeID, EmailAddress
从这一点出发,最佳的搜索方式是一次搜索所有用户。这也可以通过-LDAPFilter完成,但需要更多的操作

$mails = $listbox_Columns.SelectedItem  # this should be an array of email addresses
$filter = $mails -join ')(mail='

Get-ADUser -LDAPFilter "(|(mail=$filter))" -Properties SamAccountName, EmployeeID, EmailAddress
在这一点上,你很有可能不再需要在很多工作中分配这些信息,这是最有效的

第二个代码示例中发生了什么:

$mails-join'mail='与| mail=$filter一起创建一个LDAP搜索表达式,其形式为| mail=Amail=Bmail=C,依此类推,这将在一个服务器往返过程中为您提供所有匹配的对象,但不提供任何其他对象

当然,您需要熟悉LDAP搜索筛选器语法,并查看广告中的原始LDAP属性值,以便有效地使用它,但这对于它提供的性能提升来说是一个很小的代价。

我建议改为-LDAPFilter,如下所示:

Get-ADUser -LDAPFilter "(mail=$User)" -Properties SamAccountName, EmployeeID, EmailAddress
从这一点出发,最佳的搜索方式是一次搜索所有用户。这也可以通过-LDAPFilter完成,但需要更多的操作

$mails = $listbox_Columns.SelectedItem  # this should be an array of email addresses
$filter = $mails -join ')(mail='

Get-ADUser -LDAPFilter "(|(mail=$filter))" -Properties SamAccountName, EmployeeID, EmailAddress
在这一点上,你很有可能不再需要在很多工作中分配这些信息,这是最有效的

第二个代码示例中发生了什么:

$mails-join'mail='与| mail=$filter一起创建一个LDAP搜索表达式,其形式为| mail=Amail=Bmail=C,依此类推,这将在一个服务器往返过程中为您提供所有匹配的对象,但不提供任何其他对象


当然,您需要熟悉LDAP搜索筛选器语法,并查看广告中的原始LDAP属性值,以便有效地使用它,但这对于它提供的性能提升来说是一个很小的代价。

很抱歉,这不适合评论,但我一直在看这场讨论,想插嘴

虽然我很难引用引用,但我很清楚,-Filter参数由AD cmdlet在客户端解释/转换为LDAP查询,然后作为LDAP查询字符串转发到服务器

这可以通过在DC上增加NTDS日志记录来证明,执行-Filter查询以查看记录了什么,我打赌它将是翻译后的LDAP查询。此外,这很合理,因为AFAIK AD LDAP un接口无法回答任何其他类型的查询。我打算使用这种方法进行双重检查,这是我延迟参与的原因

多年来,我反复测试了-Filter和-LDAPFilter之间的性能,并反复提出了在两个方向上的极窄差异。考虑到总体性能的可变性,我的结论是几乎没有差异!虽然我们可以假设在解释-Filter参数时会有一些开销,但它可能是最小的,以至于无法检测到。在这项开销中还包括了查询计算属性(如Enabled)的功能。Get ADUser返回的属性很可能是UserAccountControl的逐位解释,但是可以使用-Filter查询它。关于这一点和其他属性/属性有一些争论,但我个人可以证明它的可靠性,并在其他SO讨论中提到了它

注意:对于更复杂的查询,这些结果可能会有所不同。然而,复杂性的增加可能会导致人们出于其他更直接的原因使用-LDAPQuery

我目前找不到这些讨论,但会在我找到时尝试更新此说明。我知道我得出了一个类似的结论,并对@mklement0的一个答案发表了评论,他将我引向@tomolak的一个答案,我在那里记录了类似的评论

我也早就认识到,针对广泛需求的广泛单一查询比多次重新运行Get-*要快得多。在合理范围内,这似乎是通用的,而不是特定于AD cmdlet的。如果我需要检查用户是否存在数千次,那么首先加载所有用户的列表,然后检查列表要比运行Get ADUser那么多次快得多。当然,如果我只需要检查几个用户,公式可能会向另一个方向摆动。这种坚定的观察很可能是代码加速的原因,而不是任何区别 介于-Filter和-LDAPFilter之间


根据我的经验,-LDAPFilter的实际用例是当某些属性不能用-Filter查询时。这可能是由于缺少给定属性的Filter>LDAPFilter转换。所以,我能给出的最好的建议就是使用-Filter,直到你做不到为止,并在你需要的时候切换到-LDAPFilter。我不能排除其他用例,可能是不同AD cmdlet之间查询字符串的可移植性?尽管如此,如果您对LDAP查询的一般性或具体性感到满意,那么使用它们肯定没有功能上的危害。

很抱歉,这不适合作为评论,但我一直在观看这场讨论,目的是想插嘴

虽然我很难引用引用,但我很清楚,-Filter参数由AD cmdlet在客户端解释/转换为LDAP查询,然后作为LDAP查询字符串转发到服务器

这可以通过在DC上增加NTDS日志记录来证明,执行-Filter查询以查看记录了什么,我打赌它将是翻译后的LDAP查询。此外,这很合理,因为AFAIK AD LDAP un接口无法回答任何其他类型的查询。我打算使用这种方法进行双重检查,这是我延迟参与的原因

多年来,我反复测试了-Filter和-LDAPFilter之间的性能,并反复提出了在两个方向上的极窄差异。考虑到总体性能的可变性,我的结论是几乎没有差异!虽然我们可以假设在解释-Filter参数时会有一些开销,但它可能是最小的,以至于无法检测到。在这项开销中还包括了查询计算属性(如Enabled)的功能。Get ADUser返回的属性很可能是UserAccountControl的逐位解释,但是可以使用-Filter查询它。关于这一点和其他属性/属性有一些争论,但我个人可以证明它的可靠性,并在其他SO讨论中提到了它

注意:对于更复杂的查询,这些结果可能会有所不同。然而,复杂性的增加可能会导致人们出于其他更直接的原因使用-LDAPQuery

我目前找不到这些讨论,但会在我找到时尝试更新此说明。我知道我得出了一个类似的结论,并对@mklement0的一个答案发表了评论,他将我引向@tomolak的一个答案,我在那里记录了类似的评论

我也早就认识到,针对广泛需求的广泛单一查询比多次重新运行Get-*要快得多。在合理范围内,这似乎是通用的,而不是特定于AD cmdlet的。如果我需要检查用户是否存在数千次,那么首先加载所有用户的列表,然后检查列表要比运行Get ADUser那么多次快得多。当然,如果我只需要检查几个用户,公式可能会向另一个方向摆动。这种坚定的观察可能是代码加速的原因,而不是-Filter和-LDAPFilter之间的任何区别


根据我的经验,-LDAPFilter的实际用例是当某些属性不能用-Filter查询时。这可能是由于缺少给定属性的Filter>LDAPFilter转换。所以,我能给出的最好的建议就是使用-Filter,直到你做不到为止,并在你需要的时候切换到-LDAPFilter。我不能排除其他用例,可能是不同AD cmdlet之间查询字符串的可移植性?尽管如此,如果您对LDAP查询总体上或具体上感到满意,那么使用它们肯定没有功能上的危害。

哇,这是最有效的。你可以说7次以上,这几乎是瞬间@LukeHagar LDAP筛选器字符串可能太长,但上限非常合适。在服务器阻塞之前,筛选器字符串的大小可以是多兆字节,因此对于大多数实际用途,您应该是很好的。在你犯错误之前试着把它推多远并没有什么坏处,只是为了让你对它有一种感觉。一般来说,与并行发送许多简单的查询相比,节省往返时间并让服务器对复杂的查询进行排序总是更有效。嗯,我没有确切的答案,但绝对的事实是LDAPFilter要快得多。我将删除我的评论,以免分散我的注意力。保重@mklement0这就是我的想法,但我没有任何东西来支持我的声明,这就是我删除它的原因。@mklement0是的,对于这个简单的用例来说,这似乎不是问题。但是我不确定这是否是普遍正确的,我没有被无缘无故地阻止使用-Filter,尽管我现在找不到一个好的交叉测试。哇,这是非常有效的。你可以说7次以上,这几乎是瞬间@LukeHagar LDAP筛选器字符串有可能
很长,但是上限很舒服。在服务器阻塞之前,筛选器字符串的大小可以是多兆字节,因此对于大多数实际用途,您应该是很好的。在你犯错误之前试着把它推多远并没有什么坏处,只是为了让你对它有一种感觉。一般来说,与并行发送许多简单的查询相比,节省往返时间并让服务器对复杂的查询进行排序总是更有效。嗯,我没有确切的答案,但绝对的事实是LDAPFilter要快得多。我将删除我的评论,以免分散我的注意力。保重@mklement0这就是我的想法,但我没有任何东西来支持我的声明,这就是我删除它的原因。@mklement0是的,对于这个简单的用例来说,这似乎不是问题。但是我不确定这是否是普遍正确的,我没有被无缘无故地阻止使用-Filter,尽管我现在找不到一个好的交叉测试。顺便说一句:虽然诱人的便利,但在概念上是有问题的,可能会导致误解。顺便说一句:虽然诱人的便利,这在概念上是有问题的,可能会导致误解。非常准确,最大的节省时间是为每个用户运行一个Get ADUser,而不是为整个列表运行一个格式正确的查询。非常感谢您的深入分析!这是一个非常好的阅读工具,非常准确,最大的节省时间是每个用户运行一个Get ADUser,而不是为整个列表运行一个格式正确的查询。非常感谢您的深入分析!这是一本很棒的书