【问题标题】:Reduce running time of PowerShell script减少 PowerShell 脚本的运行时间
【发布时间】:2014-05-15 04:25:16
【问题描述】:

我正在运行一个脚本,该脚本首先获取所有组,然后获取这些收集到的组的所有成员并将它们放入 .csv。

我现在已经等了三个多小时了,还没到一半……

下面是脚本。

Get-QADGroup -SizeLimit 0 -properties * | 
Select samaccountname| 
Export-CSV D:\Test_PowerShell\group.csv -NoTypeInformation

Get-Content "D:\Test_PowerShell\group.csv" | 
foreach-object {$group = $_ -replace '"', ""# grab current group name get-qadgroupmember $group -sizelimit 0 -indirect | 
`select-object samaccountname,@{n="GroupName";e={$group}}} | 
export-csv D:\Test_PowerShell\groupandmem.csv -notypeinformation

【问题讨论】:

  • 你有很多嵌套组,组是多个组的成员吗?
  • 我看到的问题是 get-qadgroupmember 获取组中所有用户的速度很慢。有没有办法一次同时将用户从多个组中提取出来?
  • 是的,有许多嵌套组,但不知道有多少层以及深度。
  • 如果您的组嵌套中有很多重复项,您可以通过缓存结果来加速它以消除重复查找。
  • 多线程查找是可能的,但创建多个进程的开销很容易适得其反。

标签: performance powershell export-to-csv member active-directory-group


【解决方案1】:

试试这个:

( Get-QADGroup -SizeLimit 0 ) | 
foreach-object {                    
                 $group = $_.samaccountname
                 get-qadgroupmember $_.samaccountname -sizelimit 0 -indirect | 
                 select-object samaccountname, @{n="GroupName";e={$group}}
               }

如果您使用的是 powershell 版本 3.0/4.0,您可以尝试使用 powershell 工作流程(我没有对性能进行任何广泛的测试,但理论上至少可以将速度提高一倍):

workflow get-UserAndGroup 
{
   $a = inlinescript {   add-pssnapin Quest.ActiveRoles.ADManagement
                        Get-QADGroup -SizeLimit 0 | select -expa samaccountname
                    }                           

   foreach -parallel ( $group in $a ) 
   {                    
     inlinescript {
                    add-pssnapin Quest.ActiveRoles.ADManagement
                    Get-qadgroupmember $using:group -sizelimit 0 -indirect | 
                    select-object samaccountname, @{n="GroupName";e={$using:group}}
                  } 
    } 
}

这样使用:

 get-UserAndGroup | select samaccountname, groupname | export-csv .\myfile.csv -notypeinformation

我的性能测试(包含 5 到 50 个用户的 30 个组):

PS C:\ps> workflow get-UserAndGroup 
{
   $a = inlinescript {   add-pssnapin Quest.ActiveRoles.ADManagement
                        Get-QADGroup  -SizeLimit 0 | select -expa samaccountname
                    }



   foreach -parallel ( $group in $a ) 
   {                    
     inlinescript {
                    add-pssnapin Quest.ActiveRoles.ADManagement
                    Get-qadgroupmember $using:group -sizelimit 0 -indirect | 
                    select-object samaccountname, @{n="GroupName";e={$using:group}}
                  } 
    } 
}

PS C:\ps> Measure-Command { get-UserAndGroup }


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 23
Milliseconds      : 512
Ticks             : 235120228
TotalDays         : 0,000272129893518519
TotalHours        : 0,00653111744444444
TotalMinutes      : 0,391867046666667
TotalSeconds      : 23,5120228
TotalMilliseconds : 23512,0228


PS C:\ps> measure-command {
( Get-QADGroup -SizeLimit 0 ) | 
foreach-object {                    
                 $group = $_.samaccountname
                 get-qadgroupmember $_.samaccountname -sizelimit 0 -indirect | 
                 select-object samaccountname, @{n="GroupName";e={$group}}
               }}


Days              : 0
Hours             : 0
Minutes           : 1
Seconds           : 7
Milliseconds      : 16
Ticks             : 670161451
TotalDays         : 0,000775649827546296
TotalHours        : 0,0186155958611111
TotalMinutes      : 1,11693575166667
TotalSeconds      : 67,0161451
TotalMilliseconds : 67016,1451

【讨论】:

  • 脚本运行良好,但用户的拉取速度相同。有很多组,里面有很多很多用户。有没有办法同时将用户从更多组中提取出来?
  • @Rudy86 如果您使用的是 3.0 或更高版本,请尝试使用工作流。
  • 如何保存工作流?作为什么扩展? .ps1 也是?
  • @Rudy86 是的。在使用函数时使用它们。我添加了一项已完成的性能测试
  • 我收到此错误代码,不知道在哪里放置缺少的开头 '('。[PS] D:\Test_PowerShell>.\PS_Group_Member_Paralel.ps1 缺少开头的 '(' 在关键字之后'foreach'。在 D:\Test_PowerShell\PS_Group_Member_Paralel.ps1:7 char:12 + foreach
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多