[PowerShell] Créer un compte administrateur local

Vous n’êtes pas sans savoir qu’une des meilleures “best practices” concernant la sécurisation des postes de travail réside dans deux critères :

  • Désactiver le compte “administrateur” local
  • Eviter de créer un compte local sur tous les postes de travail, avec le même mot de passe

Par défaut, le compte “administrateur” est désactivé sous Windows 7.

Il ne nous reste donc plus qu’à créer un nouveau compte local respectant les bonnes pratiques.

Pour se faire, j’ai écrit un script PowerShell qui créé un nouveau compte local, l’ajoute au groupe “Administrateurs” et configure son mot de passe.

Ce script peut être intégré à une séquence de tâches. Pour davantage de détails sur l’exécution d’un script powershell dans une séquence de tâches, c’est par ici.

Détails

  • Afin d’éviter de rencontrer des déboires concernant le nom du groupe “administrateurs” qui diverge selon la langue d’installation de l’OS, nous nous sommes appuyés sur son SID qui est invariable.
  • le nom du nouveau compte local est spécifié dans la variable : $newAccount_name
  • le mot de passe attribué à cet utilisateur est la concaténation de deux champs :
    • un champ commun à tous les postes : Support_
    • un champ spécifique au poste de travail : les 4 derniers caractères du nom d’ordinateur
  • Enfin, avant de créer le compte, nous lui ajoutons une description.

Script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$computerName = "$env:computername"
$List = @{}
$computer = [ADSI]"WinNT://$computerName,computer"
$grouplist = $computer.psbase.Children | Where-Object { $_.psbase.schemaclassname -eq 'group' }
foreach ($Group in $grouplist)
{
    $objgroup = New-Object System.Security.Principal.NTAccount($Group.Name)
    $strSID = $objgroup.Translate([System.Security.Principal.SecurityIdentifier])
    if($strSID -eq 'S-1-5-32-544')
    {
        $groupname = $Group.Name
 
        $newAccount_Password = 'Support_' + $computername.substring($computername.length - 4, 4)
 
        $newAccount_name = 'HelpDesk'
        $User = $computer.Create("user",$newAccount_name)
        $User.SetPassword($newAccount_Password)
        $User.SetInfo()
        ([ADSI]"WinNT://$computerName/$groupname,group").Add("WinNT://$newAccount_name")
        $user.put("Description","Compte utilisé par le service HelpDesk")
        $user.setInfo()
        $user.put("FullName",$newAccount_name)
        $user.SetInfo()
    }
}

5 réflexions au sujet de “[PowerShell] Créer un compte administrateur local

  1. Bonjour,

    Je viens de tomber sur ton script qui correspond parfaitement à e que je cherche. Etant nul en script peux tu afficher une version avec le mot de passe qui n’expire jamais stp ?

    Merci

    • Salut Philippe et désolé pour la réponse tardive. Je suis actuellement en déplacement mais dès demain je te donnerai les infos pour répondre à ta question. Salut !

    • bonjour Philippe,

      Ecore désolé pour la réponse tardive.
      Voici une version avec un mot de passe qui n’expire jamais. Il suffit de donner les bonnes valeurs à un attribut du compte : UserFlags :
      $computerName = $env:ComputerName
      $List = @{}
      $computer = [ADSI]”WinNT://$computerName,computer”
      $grouplist = $computer.psbase.Children | Where-Object { $_.psbase.schemaclassname -eq ‘group’ }

      foreach ($Group in $grouplist)
      {
      $objgroup = New-Object System.Security.Principal.NTAccount($Group.Name)
      $strSID = $objgroup.Translate([System.Security.Principal.SecurityIdentifier])
      if($strSID -eq ‘S-1-5-32-544’)
      {
      $groupname = $Group.Name
      $newAccount_Password = ‘Support_’ + $computername.substring($computername.length – 4, 4)
      $newAccount_name = ‘HelpDesk’
      $User = $computer.Create(“user”,$newAccount_name)
      $User.SetPassword($newAccount_Password)
      $User.userflags = 64 + 65536 #Passwodr cannot be changed + password never expires
      $User.SetInfo()

      ([ADSI]”WinNT://$computerName/$groupname,group”).Add(“WinNT://$newAccount_name”)
      $user.put(“Description”,”Compte utilisé par le service HelpDesk”)
      $user.setInfo()
      $user.put(“FullName”,$newAccount_name)
      $user.SetInfo()
      }
      }

    • Bonjour,
      le principe est relativement simple :
      1. Charger le fichier Csv
      2. Ajouter à ce script une boucle qui permet de parcourir la liste générée à partir du fichier csv
      3. Instancier la variable $ComputerName à chaque itération de la boucle

      ça devrait donner quelque chose dans ce genre :

      $ComputerList = Import-Csv -Path "#Chemin du fichier csv#"

      foreach ($Computer in $ComputerList)
      {
      $computerName = $computer
      $List = @{}
      $computer = [ADSI]"WinNT://$computerName,computer"
      $grouplist = $computer.psbase.Children | Where-Object { $_.psbase.schemaclassname -eq 'group' }

      foreach ($Group in $grouplist) {
      $objgroup = New-Object System.Security.Principal.NTAccount($Group.Name)
      $strSID = $objgroup.Translate([System.Security.Principal.SecurityIdentifier])
      if($strSID -eq 'S-1-5-32-544')
      {
      $groupname = $Group.Name
      $newAccount_Password = 'Support_' + $computername.substring($computername.length - 4, 4)
      $newAccount_name = 'HelpDesk'
      $User = $computer.Create("user",$newAccount_name)
      $User.SetPassword($newAccount_Password)
      $User.userflags = 512 #Enable account
      $User.SetInfo()

      ([ADSI]"WinNT://$computerName/$groupname,group").Add("WinNT://$newAccount_name")
      $user.put("Description","Compte utilisé par le service HelpDesk")
      $user.setInfo()
      $user.put("FullName",$newAccount_name)
      $user.SetInfo()
      }
      }
      }

Laisser un commentaire