Advertisement
Guest User

Untitled

a guest
Jan 3rd, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -------------------------------------------------------
  2. # MPWiK Wrocław 3 stycznia 2019 r.
  3. # Autor: Hubert Hnatczuk
  4. # Skrypt tworzy nowe konto użytkownika w Active Directory
  5. # -------------------------------------------------------
  6.  
  7. # klasa odpowiedzialna za reprezentację pojedynczego użytkownika
  8. class User {
  9.     [string]$name
  10.     [string]$surname
  11.     [string]$division
  12.     [string]$mailAddress
  13.     [string]$username
  14.    
  15.     static [string]$PASSWORD = "Aa123456"
  16.     static [string]$LOGIN_SCRIPT = "kix32.exe logowanie.kix"
  17.     static [string]$DEFAULT_GROUP_ALL = "DL_Aplikacje_ESB"
  18.     static [string]$DEFAULT_GROUP_DIV = "DL_Aplikacje_Intra_" # do tej nazwy należy dodać skrót działu, w moim przypadku jest to FI, więc pełna nazwa grupy to DL_Aplikacje_Intra_FI
  19.     static [string]$MAIL_DEFAULT_DOMAIN = "mpwik.wroc.pl"
  20.  
  21.     # generuje nazwę grupy odpowiednią dla działu, w którym znajduje się pracownik
  22.     [string]GetDivGroup() {
  23.         return [User]::DEFAULT_GROUP_DIV + $this.division
  24.     }
  25. }
  26.  
  27. # klasa odpowiedzialna za generowanie prototypów użytkowników, które mogą być przesłane do AD
  28. class UserFactory {
  29.     static [User] Create([string]$name, [string]$surname, [string]$division) {
  30.         $user = [User]::new()
  31.         $user.name = $name
  32.         $user.surname = $surname
  33.         $user.division = $division
  34.         $user = [UserFactory]::CreateUsername($user)
  35.         $user = [UserFactory]::CreateEmailAddress($user)
  36.         return $user
  37.     }
  38.  
  39.     static [User] CreateUsername([User]$user) {
  40.         $name = $user.name
  41.         $surname = $user.surname
  42.  
  43.         $name_nopl = [StringsManager]::RemovePolishChars($name)
  44.         $surname_nopl = [StringsManager]::RemovePolishChars($surname)
  45.  
  46.         $username = ""
  47.         $numberOfNameLetters = 1
  48.  
  49.         # sprawdzam, czy nazwa użytkownika istnieje, jeśli tak,
  50.         # po kolei biorę litery z imienia i doklejam je do nazwy użytkownika.
  51.         # Na przykład, jeśli tworzymy konto dla użytkownika Hubert Hnatczuk i konto hhnatczuk istnieje,
  52.         # nazwą użytkownika zostanie huhnatczuk, jeśli ta także istnieje, to nazwą zostanie hubhnatczuk itd.
  53.        
  54.         do {
  55.             $username = $name_nopl.Substring(0,$numberOfNameLetters) + $surname_nopl
  56.             $numberOfNameLetters += 1
  57.         } while ([ADController]::DoesUsernameExist($username))
  58.  
  59.        
  60.         $user.username = $username
  61.         return $user
  62.     }
  63.  
  64.     static [User] CreateEmailAddress([User]$user) {
  65.         $name = $user.name
  66.         $surname = $user.surname
  67.         $mailAddress = $name + "." + $surname + "@" + [User]::MAIL_DEFAULT_DOMAIN
  68.         while([ADController]::DoesMailAddressExist($mailAddress)) {
  69.             # specjalny przypadek - jeśli jest dwóch ludzi o tym samym imieniu i nazwisku
  70.             # należy podać spersonalizowany adres email
  71.  
  72.             $mailAddress = Read-Host -Prompt ">> Uwaga: Adres e-mail $mailAddress istnieje już w systemie. `n>> Podaj inny adres e-mail dla tego użytkownika"
  73.         }
  74.         $user.mailAddress = $mailAddress
  75.         return $user
  76.     }
  77. }
  78.  
  79. # klasa odpowiedzialna za przekazywanie i pobieranie danych do i z AD
  80. class ADController {
  81.     static [bool]DoesUsernameExist([string]$username) {
  82.         return dsquery user -samid $username
  83.     }
  84.  
  85.     static [bool]DoesMailAddressExist([string]$mailAddress) {
  86.         $result = Get-ADUser -Filter {UserPrincipalName -eq $mailAddress}
  87.         return $result -ne $null
  88.     }
  89.  
  90.     static [User]Init() {
  91.         Echo '>> W celu stworzenia konta podaj następujące dane nowego użytkownika <<'
  92.         Echo ''
  93.         $name = Read-Host -Prompt 'Imię'
  94.         $surname = Read-Host -Prompt 'Nazwisko' # w przypadku nazwiska dwuczłonowego podać je z myślnikiem, bez spacji
  95.         $division = Read-Host -Prompt 'Dział (podać skrót, np. TE, Cerok itp.)'
  96.         $user = [UserFactory]::Create($name, $surname, $division)
  97.        
  98.         return $user
  99.     }
  100.  
  101.     static [void]CreateADUser() {
  102.         $user = [ADController]::Init()
  103.         [ADController]::SendUserToAD($user)
  104.     }
  105.  
  106.     static [void]SendUserToAD([User]$user) {
  107.         $securePass = (ConvertTo-SecureString -AsPlainText ([User]::PASSWORD) -Force)
  108.         $surname = $user.surname
  109.         $name = $user.name
  110.         $email = $user.mailAddress
  111.  
  112.         New-ADUser -Name "$surname $name" -SamAccountName $user.username -AccountPassword $securePass -Path "OU=Nowi_uzytkownicy,OU=MPWIK,DC=mpwik,DC=pl" -Enabled 1 -ChangePasswordAtLogon 1 -DisplayName "$surname $name" -EmailAddress $user.mailAddress -GivenName $user.name -OtherName $user.surname -Surname $user.surname -UserPrincipalName $user.mailAddress -ScriptPath ([User]::LOGIN_SCRIPT) -OtherAttributes @{'proxyAddresses'="SMTP:$email"}
  113.         [ADController]::AddToDefaultGroups($user)
  114.     }
  115.  
  116.     static [void]RemoveADUser([User]$testUser) {
  117.         Remove-ADUser -Identity $testUser.username
  118.     }
  119.  
  120.     static [void]TestCreateADUser() {
  121.         Echo "*** SKRYPT PRACUJE W TRYBIE TESTOWYM ***"
  122.         $testUser = [ADController]::Init()
  123.         [ADController]::SendUserToAD($testUser)
  124.  
  125.         Read-Host -Prompt "Wciśnij [Enter], aby usunąć konto testowe"
  126.         [ADController]::RemoveADUser($testUser)
  127.     }
  128.  
  129.     static [void]AddToDefaultGroups([User]$user) {
  130.         $ADUser = Get-ADUser -Identity $user.username
  131.         $groupAll = Get-ADGroup -Identity ([User]::DEFAULT_GROUP_ALL)
  132.         $groupDiv = Get-ADGroup -Identity $user.GetDivGroup()
  133.         Add-ADGroupMember -Identity $groupAll -Members $ADUser
  134.         Add-ADGroupMember -Identity $groupDiv -Members $ADUser
  135.     }
  136. }
  137.  
  138. # klasa odpowiedzialna za zarządzanie napisami
  139. class StringsManager {
  140.     static [string]RemovePolishChars([string]$text) {
  141.         $text = $text.Replace("Ą", "A")
  142.         $text = $text.Replace("ą", "a")
  143.         $text = $text.Replace("Ć", "C")
  144.         $text = $text.Replace("ć", "c")
  145.         $text = $text.Replace("Ę", "E")
  146.         $text = $text.Replace("ę", "e")
  147.         $text = $text.Replace("Ł", "L")
  148.         $text = $text.Replace("ł", "l")
  149.         $text = $text.Replace("Ń", "N")
  150.         $text = $text.Replace("ń", "n")
  151.         $text = $text.Replace("Ó", "O")
  152.         $text = $text.Replace("ó", "o")
  153.         $text = $text.Replace("Ś", "S")
  154.         $text = $text.Replace("ś", "s")
  155.         $text = $text.Replace("Ź", "Z")
  156.         $text = $text.Replace("ź", "z")
  157.         $text = $text.Replace("Ż", "Z")
  158.         $text = $text.Replace("ż", "z")
  159.         return $text
  160.     }
  161. }
  162.  
  163.  
  164. # --------------------------------------------------------------
  165. # ----------- POCZĄTEK PROGRAMU --------------------------------
  166. # --------------------------------------------------------------
  167.  
  168. # Odkomentuj poniższą linię, aby przejść do trybu testowego
  169. # [ADController]::TestCreateADUser()
  170.  
  171. # Właściwa metoda uruchamiająca skrypt, zakomentuj, aby przejść do trybu testowego
  172. [ADController]::CreateADUser()
  173.  
  174. # --------------------------------------------------------------
  175. # ----------- KONIEC PROGRAMU ----------------------------------
  176. # --------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement