fork download
  1. ########################################################################################################
  2. ########################################################################################################
  3. # Script de création d'utilisateurs a partir d'un CSV "eleves.csv"
  4. # Format du fichier élèves :
  5. #
  6. # Format inspiré du fichier xml rectorat
  7. # classe,nom,prenom
  8. #
  9. #
  10. #
  11. # Variables pour la création de mots de passe
  12. #
  13. ########################################################################################################
  14. ########################################################################################################
  15. # VARIABLES
  16. #
  17. ########################################################################################################
  18. ########################################################################################################
  19.  
  20. param([int] $len = 4,[string] $chars = "ABC0123456789",[string] $nums="0123456789")
  21. $bytes = new-object "System.Byte[]" $len
  22. $rnd = new-object System.Security.Cryptography.RNGCryptoServiceProvider
  23.  
  24. Function user_exists($ola)
  25. {
  26. $LdapFilter = "(&(objectcategory=user)(cn=$ola))"
  27. $SearchRoot = $domain
  28. $Searcher = New-Object DirectoryServices.DirectorySearcher($SearchRoot, $LdapFilter)
  29. $mariejose = $Searcher.FindAll()
  30. if($mariejose -ne $null)
  31. {
  32. return $true;
  33. }
  34. else
  35. {
  36. return $false;
  37. }
  38. }
  39.  
  40. Function group_exists($ola)
  41. {
  42. $LdapFilter = "(&(objectcategory=group)(cn=$ola))"
  43. $SearchRoot = $domain
  44. $Searcher = New-Object DirectoryServices.DirectorySearcher($SearchRoot, $LdapFilter)
  45. $mariejose = $Searcher.FindAll()
  46. if($mariejose -ne $null)
  47. {
  48. return $true;
  49. }
  50. else
  51. {
  52. return $false;
  53. }
  54. }
  55.  
  56. Function Remove-Diacritics([string]$String)
  57. {
  58. $objD = $String.Normalize([Text.NormalizationForm]::FormD)
  59. $sb = New-Object Text.StringBuilder
  60.  
  61. for ($i = 0; $i -lt $objD.Length; $i++) {
  62. $c = [Globalization.CharUnicodeInfo]::GetUnicodeCategory($objD[$i])
  63. if($c -ne [Globalization.UnicodeCategory]::NonSpacingMark) {
  64. [void]$sb.Append($objD[$i])
  65. }
  66. }
  67.  
  68. return("$sb".Normalize([Text.NormalizationForm]::FormD))
  69. }
  70.  
  71. #Définition du domaine
  72. $smb_serveur = "\\SERVEUR2008\"
  73. $domaine = "stj"
  74. $dc_domaine = "lan"
  75. $ou_eleves = "ou=eleves,dc=$($domaine),dc=$($dc_domaine)"
  76. $domain = [ADSI]"LDAP://$($ou_eleves)"
  77.  
  78.  
  79. # Chemin réseau du dossier docs
  80. $path_eleve = "$($smb_serveur)eleves\"
  81. $path_drive = "E:\Users\eleves\"
  82.  
  83. # Chemin réseau du dossier profil
  84. $profil_root = "$($smb_serveur)profil\"
  85. $profil_root_eleve = "$($smb_serveur)profil\eleves\"
  86.  
  87. # Chemin réseau du script de logon
  88. $loginscriptpath = "$($smb_serveur)netlogon\"
  89.  
  90. #Import du fichier CSV
  91. $csv_users = Import-Csv .\eleves.csv
  92. $current_time = Get-Date –f "yyyy-MM-dd-HH:mm:ss"
  93.  
  94.  
  95.  
  96. ########################################################################################################
  97. ########################################################################################################
  98. # Boucle principale
  99. #
  100. ########################################################################################################
  101. ########################################################################################################
  102.  
  103. #Boucle de création
  104. foreach ($line in $csv_users)
  105. {
  106. # Nettoyage nom,prenom
  107. $nom_famille = $line.nom.Replace(" ","")
  108. $nom_famille = Remove-Diacritics([string]$nom_famille)
  109.  
  110. $prenom = $line.prenom.Replace(" ","")
  111. $prenom = Remove-Diacritics([string]$prenom)
  112.  
  113. # Init des variables
  114. $NewPassword = ""
  115.  
  116. #Mot de passe 4 chiffres
  117. $rnd.GetBytes($bytes)
  118.  
  119. for( $i=0; $i -lt $len; $i++ )
  120. {
  121. $NewPassword += $chars[ $bytes[$i] % $chars.Length ]
  122. }
  123.  
  124. #Fichier de log
  125. "$($nom_famille) $($prenom),$($line.classe),$($NewPassword)" >> ".\test.csv"
  126.  
  127. $inc = 1
  128. $login = "$($nom_famille)"
  129. while(user_exists($login) -eq $true)
  130. {
  131. $login = "$($nom_famille)$($inc)"
  132. $inc += 1
  133. }
  134.  
  135.  
  136. # Sortie écran pour repère
  137. Write-Host "$($nom_famille) $($prenom) - $($line.classe) - Login : $login"
  138. Write-Host " Password : $($NewPassword)"
  139.  
  140. #################################################################################################
  141. #################################################################################################
  142. # CREATION DES DOSSIERS
  143. # -> Dossier Classe
  144. # -> Dossier Commun
  145. # -> Dossier Utilisateur
  146. #
  147. # AD : Groupe Classe
  148. # AD : Droit de sécurité du groupe classe sur dossier commun
  149. #
  150. #################################################################################################
  151. #################################################################################################
  152.  
  153. # Creation du dossier classe dans l'arborescence + Groupe classe AD
  154. $path_classe = Join-Path $path_eleve -childpath $line.classe
  155. if(!(Test-Path $path_classe))
  156. {
  157. # Le dossier classe n'existe pas -> on le crée
  158. New-Item $path_classe -type directory | out-null
  159. }
  160.  
  161. $GroupName = "Classe"+$line.classe
  162. $Groupexists = group_exists("$GroupName")
  163. if($Groupexists -eq $false)
  164. {
  165. $objOU = $domain
  166. $objGroup = $objOU.Create("group","CN="+$GroupName)
  167. $objGroup.Put("sAMAccountName", $GroupName )
  168. $objGroup.SetInfo()
  169. }
  170.  
  171.  
  172. # Creation dossier documents utilisateur
  173. $docs_eleve = Join-Path $path_eleve -childpath $login
  174. if(!(Test-Path $docs_eleve))
  175. {
  176. # Le dossier utilisateur n'existe pas -> on le crée
  177. New-Item $docs_eleve -type directory | out-null
  178. }
  179.  
  180. # Creation dossier profil utilisateur
  181. $profil_user = Join-Path $profil_root_eleve -ChildPath $login
  182. if(!(Test-Path $profil_user))
  183. {
  184. New-Item $profil_user -type directory | out-null
  185. }
  186.  
  187. #################################################################################################
  188. #################################################################################################
  189. # CREATION DES UTILISATEURS
  190. # -> Utilisateur avec ses identifiants
  191. # -> Activation du profil
  192. # -> Création du mot de passe
  193. # -> Ajout de l'utilisateur au groupe classe
  194. #
  195. #################################################################################################
  196. #################################################################################################
  197.  
  198. $user_exists = user_exists($login)
  199. if($user_exists -eq $false)
  200. {
  201. # Creation de l'utilisateur
  202. $newUser = $domain.Create("user","cn=$($login)")
  203. $newUser.put("sAMAccountName","$($login)")
  204. $newUser.put("givenName","$($prenom)")
  205. $newUser.put("sn","$($nom_famille)")
  206. $newUser.put("title", "Eleve")
  207. $newUser.put("description", "Eleve de $($line.classe)")
  208. $newUser.put("displayName","$($nom_famille) $($prenom)")
  209.  
  210. # Activation du profil
  211. $newUser.SetInfo()
  212. $newUser.psbase.InvokeSet("Accountdisabled",$false)
  213. $newUser.psbase.CommitChanges()
  214.  
  215. # Creation du Mot de Passe
  216. $Userpwd = ([ADSI]"LDAP://CN=$login,$($ou_eleves)")
  217. $Userpwd.SetPassword($NewPassword)
  218. $Userpwd.Put("userAccountControl", "65536")
  219. $Userpwd.SetInfo()
  220.  
  221. # Ajout au groupe classe
  222. $Group = [adsi]"LDAP://CN=$GroupName,$($ou_eleves)"
  223. $User = "LDAP://CN=$login,$($ou_eleves)"
  224. $Group.Add($User)
  225. }
  226. else
  227. {
  228. Write-Error "Utilisateur $login existe deja !"
  229. }
  230.  
  231. ##################################################################################################
  232. ##################################################################################################
  233. # PARTAGE RESEAUX
  234. # AD : Partage reseau du dossier eleve Mes Documents
  235. # AD : Droit de sécurité sur dossier eleve Mes Documents
  236. #
  237. ##################################################################################################
  238. ##################################################################################################
  239.  
  240. # Partage réseau samba du dossier classe
  241. $ShareName = $line.classe+"$"
  242. $checkShare = (Get-WmiObject Win32_Share -Filter "Name='$ShareName'")
  243. if ($checkShare -eq $null)
  244. {
  245. $path_classe_drive = Join-Path $path_drive -childpath $line.classe
  246. $ShareName = $line.classe+"$"
  247. $Type = 0
  248. $objWMI = [wmiClass] 'Win32_share'
  249. $objWMI.create($path_classe_drive, $ShareName, $Type) | Out-Null
  250. }
  251.  
  252. # Partage réseau samba du dossier eleve
  253. $ShareName = $login+"$"
  254. $checkShare = (Get-WmiObject Win32_Share -Filter "Name='$ShareName'")
  255. if ($checkShare -eq $null)
  256. {
  257. $path_eleve_drive = Join-Path $path_drive -childpath $login
  258. $ShareName = $login+"$"
  259. $Type = 0
  260. $objWMI = [wmiClass] 'Win32_share'
  261. $objWMI.create($path_eleve_drive, $ShareName, $Type) | Out-Null
  262. }
  263.  
  264. # Droit de sécurité sur dossier eleve
  265. $acl = Get-Acl $path_eleve_drive
  266. $permission = "$($domaine)\$login","FullControl","Allow"
  267. $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
  268. $acl.SetAccessRule($accessRule)
  269. $acl | Set-Acl $path_eleve_drive
  270.  
  271. # Droit de sécurité sur dossier eleve
  272. $acl = Get-Acl $profil_user
  273. $permission = "$($domaine)\$login","FullControl","Allow"
  274. $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
  275. $acl.SetAccessRule($accessRule)
  276. $acl | Set-Acl $profil_user
  277.  
  278. #################################################################################################
  279. #################################################################################################
  280. # Attributs de profil itinérant
  281. # AD : Définition du chemin de profil
  282. # AD : Définition du dossier homedir
  283. #
  284. #################################################################################################
  285. #################################################################################################
  286.  
  287. $user_exists = user_exists($login)
  288. if($user_exists -eq $true)
  289. {
  290. # Attributs de profil itinerant (dossier, script)
  291. $Userpwd = [ADSI]"LDAP://CN=$login,$($ou_eleves)"
  292.  
  293. # Dossier de profil
  294. $Userpwd.put("profilePath","$profil_user")
  295. $Userpwd.put("ScriptPath", "$($login).vbs")
  296.  
  297. # Dossier de base
  298. $Userpwd.put("homeDrive","H:")
  299. $Userpwd.put("homeDirectory", "$docs_eleve")
  300. $Userpwd.SetInfo()
  301. }
  302. else
  303. {
  304. Write-Host "--- Attributs de profil itinerant ---"
  305. Write-Host "Utilisateur $login introuvable !"
  306. }
  307.  
  308.  
  309. #################################################################################################
  310. #################################################################################################
  311. # Creation du .bat eleve
  312. #
  313. # Création du fichier .vbs lancé a la connexion
  314. #
  315. #################################################################################################
  316. #################################################################################################
  317.  
  318.  
  319. $fichier = get-content "$($loginscriptpath)exemple_eleves.vbs" |foreach {$_ -replace "SERVEURSMB",$smb_serveur -replace "LOGIN",$login -replace "CLASSE",$line.classe}
  320. set-content "$($loginscriptpath)$($login).vbs" $fichier
  321.  
  322. #############################
  323. # RAZ des variables
  324. #############################
  325.  
  326. $NewPassword = ""
  327. $id = ""
  328. }
  329.  
  330.  
  331.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty