Guest User

AD Users logonHours attribute export (logon-time_v3.ps1)

a guest
Oct 14th, 2011
336
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # ======================================================================
  2. # NAME: logon-time_v3.ps1
  3. # version: 3
  4.  
  5. # AUTHOR: Ivanov Alexander , Microsoft Rus LLC
  6. # DATE  : 02/09/2011
  7. #
  8. # Description: export user from AD
  9. # Usage: logon-time_v3.ps1
  10. #
  11. # ======================================================================
  12. # THIS CODE IS PROVIDED "AS IS" WITHOUT SUPPORT AND WARRANTY OF ANY KIND
  13. # ======================================================================
  14.  
  15. #
  16.  
  17. $dstFile                = "C:\temp\export.csv"  # путь экспорта файла
  18.  
  19. $domain                 = ([ADSI]"LDAP://RootDSE").psbase.properties.DefaultNamingContext
  20.  
  21. # ==========================================================
  22. # Функция чтения часовых настроек
  23. # ----------------------------------------
  24. # $byte     - байт содержащий настройки
  25. # ----------------------------------------
  26. # Возвращает строку длинной в 8 символов
  27. # ==========================================================
  28. function ReadHours($byte)
  29. {
  30.      if ($byte -eq 0)
  31.      { return "00000000" }
  32.  
  33.      $str = [Convert]::ToString($byte, 2)  # конвертация байта в двоичное число
  34.      
  35.      $result = ""
  36.      for($hour = 7; $hour -gt -1; $hour--)   # реверс строки
  37.      {
  38.        $result +=$str[$hour]  
  39.      }
  40.  
  41.      return (($result+"00000000").substring(0,8))
  42. }
  43.  
  44. # ==========================================================
  45. # Функция чтения часовых настроек
  46. # ----------------------------------------
  47. # $byte     - байт содержащий настройки
  48. # ----------------------------------------
  49. # Возвращает строку длинной в 8 символов
  50. # ==========================================================
  51. function ConvertHours ($dn,$name,$hours)
  52. {
  53.  
  54.  $user =   New-Module NewObject {                                              #Формируем новую запись для экспорта CSV
  55.                         [string]$dn                   = ""
  56.                         [string]$name                 = ""
  57.                         [string]$hoursS               = "All"                 # часы доступа воскресенье
  58.                         [string]$hoursM               = "All"                 # часы доступа понедельник
  59.                         [string]$hoursTu              = "All"                 # часы доступа вторник
  60.                         [string]$hoursW               = "All"                 # часы доступа среда
  61.                         [string]$hoursTh              = "All"                 # часы доступа четверг
  62.                         [string]$hoursFr              = "All"                 # часы доступа пятница
  63.                         [string]$hoursSt              = "All"                 # часы доступа суббота
  64.            
  65.  
  66.             Export-ModuleMember -Variable *
  67.         } -asCustomObject
  68.        
  69.         $Wday = @("S","M","Tu","W","Th","Fr","St")                           #список дней недели
  70.        
  71.         $user.dn    = $dn
  72.         $user.name  = $name
  73.        
  74.         if ($hours)
  75.         {
  76.        
  77.                 #создание строки содержащий бит доступа для каждого часа в 24x7
  78.                 $hoursline = ""
  79.                 $hours | select-object -skip 1 | foreach-object  {  $hoursline += ReadHours $_  }
  80.                 $hours | select-object -first 1 | foreach-object {  $hoursline += ReadHours $_  }
  81.                
  82.                 if ( $hoursline -match "0" )  
  83.                 {
  84.                     #если есть исключения 0 - доступ запрещен
  85.                     For ($day = 0; $day -le ($Wday.Length-1); $day++)  # цикл по дням недели
  86.                     {
  87.                         $d =  "hours" + $Wday[$day]
  88.                         $tmp = @()
  89.                         $dayline = $hoursline.substring($day*24,24)   # развернутая строка с 1 по 24 час
  90.                        
  91.                         # создаем регулярное выражение для поиска периодов разрешенного доступа
  92.                         # для строки 00011100001111011
  93.                            
  94.                         $regex = new-object -TypeName "System.Text.RegularExpressions.Regex" "(1+)"  
  95.                         $matches = $regex.Matches($dayline)
  96.                         if ($matches)
  97.                         {
  98.                           foreach($match in $matches)
  99.                           {
  100.                              $groups = $match.Groups | select-object -skip 1
  101.                              foreach($g in $groups)
  102.                              {
  103.                                   $tmp += @("{0}-{1}" -f  $g.Index ,($g.Index + $g.Length))  
  104.                              }
  105.                           }
  106.                         }
  107.                         $tpl.$d = ($tmp -join ";" )
  108.                        
  109.                      }# endfor
  110.                    
  111.                 }# end if -match 0
  112.                
  113.         }# end if $h
  114.      
  115.         return $user
  116. }
  117.  
  118. # ==========================================================
  119. # Функция поиска контактов
  120. # ----------------------------------------
  121. # $root     - узел AD
  122. # ----------------------------------------
  123. # Возвращает массив объектов DirectoryEntry
  124. # ==========================================================
  125. function GetUsers( [string]$root)
  126. {
  127.         $objDomain = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$root")
  128.        
  129.         $objSearcher = New-Object System.DirectoryServices.DirectorySearcher($objDomain)   #поиск в AD
  130.         $objSearcher.Filter = "(&(objectClass=user))"          
  131.        
  132.         $result = $objSearcher.FindAll()
  133.         $arrResult = @();
  134.        
  135.         if ($result)
  136.         {
  137.             foreach($user in $result)
  138.             {
  139.               $arrResult += @([System.DirectoryServices.DirectoryEntry]$user.GetDirectoryEntry())
  140.             }
  141.         }
  142.         return $arrResult;    
  143.    
  144. }
  145.  
  146. # ==========================
  147. # основной алгоритм
  148. # ==========================
  149.                              
  150. $user = @();
  151. # поиск пользователей в AD
  152. GetUsers ( $ou ) | Foreach-object  {  $user += Convert  $_.Properties["distinguishedName"].value  $_.Properties["displayName"].value $_.Properties["logonHours"].value }
  153.  
  154. # экспорт в файл
  155. $user | select-object dn , name, hoursM, hoursTu, hoursW, hoursTh, hoursFr, hoursSt, hoursS  | Export-Csv $dstFile -NoTypeInformation -Encoding UTF8
  156.  
  157.  
  158.  
RAW Paste Data