VBScript WSHell.Run Несколько процессов - PullRequest
1 голос
/ 29 июля 2011

Кто-нибудь знает, как я могу сделать следующее: У меня есть скрипт, который будет запускаться и получать всех пользователей из AD с назначенным homedir и сбрасывать разрешения для этой папки и всего, что в ней. Проблема в том, что это занимает очень много времени, и если я не установлю переменную .run для Wait при возврате в true, я получу тысячи запущенных процессов cacls. Я хочу ограничить число процессов до 50, и после завершения одного процесса перейдите к следующему пользователю. Сценарий действительно прост:

' Get Users Home Directories from AD
' Then grant Administrators FULL CONTROL and the USER MODIFY ONLY
'
Set WshShell = WScript.CreateObject("WScript.Shell")
'
' Get users with home directories
WScript.Echo "Retrieving user account names and home directories from active directory. . ."
Set objWMIService = GetObject("winmgmts:root\directory\ldap")
Set colItems = objWMIService.ExecQuery("Select ds_sAMAccountName, ds_homeDirectory From ds_user WHERE ds_homeDirectory IS NOT NULL")

WScript.Echo ""

' Loop through users setting permissions
For Each oUser in colItems
    WScript.Echo "Setting permissions for " & oUser.ds_sAMAccountName & " Directory " & oUser.ds_homeDirectory
    WshShell.Run "xcacls " & oUser.ds_homeDirectory & " /y /t /g Administrators:F", 0, True
    WshShell.Run "xcacls " & oUser.ds_homeDirectory & " /e /t /g " & oUser.ds_sAMAccountName & ":C", 0, True
Next

Кто-нибудь знает, как я могу это сделать?

Спасибо

Редактировать :::: Я думаю, я понял это ...

For Each oUser in colItems
    numrunning = HowMany
    while numrunning > 25
        WScript.Echo "Waiting for other processes to finish"
        WScript.Sleep 10000
        numrunning = HowManyRunning
    wend
    WScript.Echo "Setting permissions for " & oUser.ds_sAMAccountName & " Directory " & oUser.ds_homeDirectory
    WshShell.Run "xcacls " & oUser.ds_homeDirectory & " /y /t /g Administrators:F", 0, False
    WshShell.Run "xcacls " & oUser.ds_homeDirectory & " /e /t /g " & oUser.ds_sAMAccountName & ":C", 0, False
Next

Function HowManyRunning()
  Dim Proc1,Proc2,Proc3
  Set Proc1 = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
  Set Proc2 = Proc1.ExecQuery("select * from win32_process" )
  HowMany=0
  For Each Proc3 in Proc2
    If LCase(Proc3.Caption) = "xcacls.exe" Then
      HowMany=HowMany + 1
    End If
  Next
End Function
...