Question Création compte ad via un compte ad existant

Plus d'informations
il y a 9 ans 7 mois #18094 par Philippe
a la suite de l'article ou tu a trouver ton code, tu avais la solution

ci-dessous un extrait que tu rajoute a ce que l'on a déjà construit :

[code:1]# Déclaration des variables
$TSPath = \"\\server\partage\" # le chemin du profil TS de l'user
# $Nomdestination = \"atoto\" # le nom du compte a modifier

$searcher = New-Object adsisearcher
$searcher.Filter = \"(&(objectCategory=person)(objectClass=user)(sAMAccountName=$Nomdestination))\"
$results = $searcher.FindAll()
$results
foreach ($result in $results) {
$user = [adsi]$result.Path
$user.psbase.invokeSet(\"TerminalServicesProfilePath\",$TSPath)
$user.setinfo()
}
[/code:1]

voila le code complet qui a été construit durant tout ce fil :
il te plus cas géré les erreur

[code:1]
Import-Module activedirectory

$NomModele = \"test2\"
# export du modèle
$a = Get-ADuser $NomModele -Properties * | export-csv c:\modele.csv

# utilisation du modèle
$a = import-csv c:\modele.csv
$a.SamAccountName = \"atoto\"
$a.DisplayName = \"allo toto\"
$a.Name = \"allo toto\"
$a.sn = \"toto\"
$a.GivenName = \"allo\"
$a.mail = \"atoto@email.com\"
$a.EmailAddress = \"atoto@email.com\"
$a.UserPrincipalName = \"atoto@domaine.lan\"
$a.HomeDirectory = \"c:\dossierhomedir\"
$a.homeDrive = \"Z:\"
$a.scriptPath = \"c:\dossierscript\script.bat\"

$a | gm | where {$_.MemberType -eq \"NoteProperty\" -and ($a.\"$($_.name)\" -eq \"\" -or $a.\"$($_.name)\" -match \"^Microsoft\"«»)} | foreach {$a.PSObject.Properties.Remove(\"$($_.name)\"«»)}
$a | New-ADUser -Path \"OU=TEST,DC=domaine,DC=lan\" -Name $a.name -SamAccountName $a.sAMAccountName -accountPassword (ConvertTo-SecureString -AsPlainText \"P@sswOrd\" -Force) -enable $True
Enable-ADAccount -Identity $a.sAMAccountName

$Nomdestination = $a.sAMAccountName
# copie tous les groupes d\"un utilisateur sur un autre utilisateur
Get-ADPrincipalGroupMembership $NomModele | where {$_.name -ne \"Utilisa. du domaine\"} | foreach {Add-ADGroupMember -Identity $_.name $Nomdestination}


# Déclaration des variables
$TSPath = \"\\server\partage\" # le chemin du profil TS de l'user
$TShdrive = \"\"

$searcher = New-Object adsisearcher
$searcher.Filter = \"(&(objectCategory=person)(objectClass=user)(sAMAccountName=$Nomdestination))\"
$results = $searcher.FindAll()
foreach ($result in $results) {
$user = [adsi]$result.Path
$user.psbase.invokeSet(\"TerminalServicesProfilePath\",$TSPath)
$user.setinfo()
}
[/code:1]

désoler mais si j'avais bien lu le premier message on aurais avancer plus vite

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 7 mois #18095 par Arakdy Alinovitch
Bonjour,

J'en suis arrivé au même point que vous sauf pour le lecteur de base qui est également situé dans le profil des services de bureau à distance. Car dans votre code, il définit le dossier de base dans le profil \"normale\". Désormais tout fonctionne parfaitement, je n'ai qu'à ajouter quelque fonctionnalité dans mon code pour gérer le temps d'activation du nouveau compte, la récupération automatique des OU et activer la case \"l'utilisateur devra changer le mot de passe\" et enfin ajouter une commande que j'ai déjà pour la création automatique d'une boîte mail exchange.

Voici donc mon code, sans les modifications précédemment citées, optimisé et permettant également la saisie du nom de compte, ...

[code:1]
# Importation du module ActiveDirectory
Import-Module ActiveDirectory

# Export du modèle
$NomModele = Read-Host \"Entrez le compte de l'utilisateur\"
Get-ADuser $NomModele -Properties * | export-csv c:\modele.csv

# utilisation du modèle
$a = import-csv c:\modele.csv
$a.SamAccountName = Read-Host \"Nom du nouveau compte utilisateur\"
$a.sn = Read-Host \"Nom de l'utilisateur\"
$a.GivenName = Read-Host \"Prénom de l'utilisateur\"
$a.DisplayName = $a.sn + \" \" + $a.GivenName
$a.Name = $a.DisplayName
$a.UserPrincipalName = $a.SamAccountName + \"mydomain.lan\"
$Box = \"OU=TEST,OU=UTILISATEURS,DC=mydomain,DC=lan\"

$a | gm | where {$_.MemberType -eq \"NoteProperty\" -and ($a.\"$($_.name)\" -eq \"\" -or $a.\"$($_.name)\" -match \"^Microsoft\"«»)} | foreach {$a.PSObject.Properties.Remove(\"$($_.name)\"«»)}

$a | New-ADUser -Path $Box -Name $a.name -SamAccountName $a.sAMAccountName -accountPassword (ConvertTo-SecureString -AsPlainText \"Azerty14\" -Force) -enable $True

Enable-ADAccount -Identity $a.sAMAccountName

$Nomdestination = $a.sAMAccountName

# Copie des groupes de l'utilisateur modèle sur un autre utilisateur

Get-ADPrincipalGroupMembership $NomModele | where {$_.name -ne \"Utilisa. du domaine\"} | foreach {Add-ADGroupMember -Identity $_.name $Nomdestination}


# Déclaration des variables

$TSPath = \"\\servname\profils\%username%\"
$TSHomeDirectory = \"\\sername\homedir\%username%\"
$TSHomeDrive = \"Z:\"

$searcher = New-Object adsisearcher
$searcher.Filter = \"(&(objectCategory=person)(objectClass=user)(sAMAccountName=$Nomdestination))\"
$results = $searcher.FindAll()

foreach ($result in $results) {
$user = [adsi]$result.Path
$user.psbase.invokeSet(\"TerminalServicesProfilePath\",$TSPath)
$user.psbase.invokeSet(\"TerminalServicesHomeDrive\",$TSHomeDrive)
$user.psbase.invokeSet(\"TerminalServicesHomeDirectory\",$TSHomeDirectory)

$user.setinfo()

}


[/code:1]<br><br>Message édité par: Arkady910, à: 15/09/14 14:25

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 7 mois #18096 par Philippe
Bonjour Arkady910,

en relisant tous le fil, je me suis dis que le paramètre \&quot;-Properties *\&quot; de \&quot;get-aduser\&quot; été devenue inutile et donc la ligne qui commence par \&quot;$a | gm | where {$_.MemberType -eq...\&quot; été aussi inutile !

ce qui clarifie le code. A toi de voir après un petit test pour confirmer que ca fonctionne sans erreur.

pour le dossier profil console local (profil \&quot;normal\&quot;), j'avais remplie tous les champs pour faire les test de copie.


Pour la case \&quot;l'utilisateur devra changer le mot de passe\&quot; il y le parametre \&quot;ChangePasswordAtLogon\&quot; dans l'extrait suivant de l'aide de new-aduser

ChangePasswordAtLogon

Specifies whether a password must be changed during the next logon attempt. Possible values for this parameter include:
$false or 0
$true or 1

This parameter cannot be set to $true or 1 for an account that also has the PasswordNeverExpires property set to true.


enfin pour la date expiration du compte (le temps d'activation) tu trouvera le paramètre \&quot;AccountExpirationDate\&quot; :

AccountExpirationDate

Specifies the expiration date for an account. When you set this parameter to 0, the account never expires. This parameter sets the AccountExpirationDate property of an account object. The LDAP Display name (ldapDisplayName) for this property is accountExpires.

Use the DateTime syntax when you specify this parameter. Time is assumed to be local time unless otherwise specified. When a time value is not specified, the time is assumed to 12:00:00 AM local time. When a date is not specified, the date is assumed to be the current date. The following examples show commonly-used syntax to specify a DateTime object.
\&quot;4/17/2006\&quot;
\&quot;Monday, April 17, 2006\&quot;
\&quot;2:22:45 PM\&quot;
\&quot;Monday, April 17, 2006 2:22:45 PM\&quot;

These examples specify the same date and the time without the seconds.
\&quot;4/17/2006 2:22 PM\&quot;
\&quot;Monday, April 17, 2006 2:22 PM\&quot;
\&quot;2:22 PM\&quot;

The following example shows how to specify a date and time by using the RFC1123 standard. This example defines time by using Greenwich Mean Time (GMT).
\&quot;Mon, 17 Apr 2006 21:22:48 GMT\&quot;

The following example shows how to specify a round-trip value as Coordinated Universal Time (UTC). This example represents Monday, April 17, 2006 at 2:22:48 PM UTC.
\&quot;2006-04-17T14:22:48.0000000\&quot;

The following example shows how to set this parameter to the date May 1, 2012 at 5 PM.
-AccountExpirationDate \&quot;05/01/2012 5:00:00 PM\&quot;


ces paramètres sont à rajouter à la commande new-aduser évidemment.

si tu a des questions n'hésite pas a ouvrir un autre sujet.<br><br>Message édité par: 6ratgus, à: 15/09/14 16:07

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 7 mois #18097 par Philippe
bon j'ai fait un rapide test il faut au moins les attribues \&quot;-Properties DisplayName,sn,mail,UserPrincipalName\&quot; dans get-aduser

ATTENTION tu n'a pas réinitialisé l'adresse email dans ton code
fait au moins un $a.mail = \&quot;\&quot; sinon tous tes utilisateurs auront la même adresse email dans l'AD !

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 7 mois #18098 par Arakdy Alinovitch
C'est ce que j'ai trouvé pour tout ce que tu as précédemment cité, oui on ne le vois pas dans mon code (j'ai du mal effectuer le copier/coller) mais je l'ai bien indiqué pour l'adresse mail. Voici la dernière version de mon code incluant toute les fonctionnalité précédemment cité (gestion du temps d'activation du compte, changement du mot de passe dès la première ouverture de session utilisateur, récupération automatique des OU, ...):

[code:1]# Importation du module ActiveDirectory
Import-Module ActiveDirectory

# Export de l'utilisateur modèle
$NomModele = Read-Host \&quot;Entrez le compte de l'utilisateur modèle\&quot;
Get-ADuser $NomModele -Properties * | export-csv c:\userad.csv

# Utilisation de l'utilisateur modèle
$a = import-csv c:\userad.csv
$a.SamAccountName = Read-Host \&quot;Nom du nouveau compte utilisateur\&quot;
$a.sn = Read-Host \&quot;Nom de l'utilisateur\&quot;
$a.givenName = Read-Host \&quot;Prénom de l'utilisateur\&quot;
$a.displayName = $a.sn + \&quot; \&quot; + $a.givenName
$a.name = $a.displayName
$a.mail = \&quot;\&quot;
$a.userPrincipalName = $a.SamAccountName + \&quot;mydomain.lan\&quot;

# Récupération automatique des OU de l'utilisateur modèle
$OU = Get-ADuser $NomModele -Properties DistinguishedName
$Box = [Regex]::replace($OU,'.*[a-z],(OU=.*DC=LAN).*','$1')

$a | gm | where {$_.MemberType -eq \&quot;NoteProperty\&quot; -and ($a.\&quot;$($_.name)\&quot; -eq \&quot;\&quot; -or $a.\&quot;$($_.name)\&quot; -match \&quot;^[0-9]\&quot; -or $a.\&quot;$($_.name)\&quot; -match \&quot;^Microsoft\&quot;«»)} | foreach {$a.PSObject.Properties.Remove(\&quot;$($_.name)\&quot;«»)}

$a | New-ADUser -Path $Box -Name $a.name -SamAccountName $a.SamAccountName -accountPassword (ConvertTo-SecureString -AsPlainText \&quot;Azerty14\&quot; -Force) -enable $True

$Nomdestination = $a.SamAccountName

# Copie des groupes de l'utilisateur modèle sur un autre utilisateur
Get-ADPrincipalGroupMembership $NomModele | where {$_.name -ne \&quot;Utilisa. du domaine\&quot;} | foreach {Add-ADGroupMember -Identity $_.name $Nomdestination}

# L'utilisateur devra changer de mot de passe
Set-ADUser $a.SamAccountName -ChangePasswordAtLogon $True

# Gestion du temps d'activation du nouveau compte
$contrat = Read-Host \&quot;Type de contrat (CDI=1 - CDD=2)\&quot;
if($contrat -eq 2){
$datetime = Read-Host \&quot;Date d'expiration (ex:Monday, November 18, 2014)\&quot;
Set-ADAccountExpiration $a.SamAccountName -DateTime $datetime
}
Enable-ADAccount -Identity $a.SamAccountName

# Déclaration des variables
$TSHomeDirectory = \&quot;\\servname\homedir\%username%\&quot;
$TSHomeDrive = \&quot;Z:\&quot;
$TSPath = \&quot;\\servname\profils\%username%\&quot;

$searcher = New-Object adsisearcher
$searcher.Filter = \&quot;(&amp;(objectCategory=person)(objectClass=user)(sAMAccountName=$Nomdestination))\&quot;
$results = $searcher.FindAll()
foreach ($result in $results) {
$user = [adsi]$result.Path
$user.psbase.invokeSet(\&quot;TerminalServicesProfilePath\&quot;,$TSPath)
$user.psbase.invokeSet(\&quot;TerminalServicesHomeDrive\&quot;,$TSHomeDrive)
$user.psbase.invokeSet(\&quot;TerminalServicesHomeDirectory\&quot;,$TSHomeDirectory)

$user.setinfo()
}

Write-Host \&quot;La création de l'utilisateur est maintenant terminé!\&quot;
[/code:1]

Le seul point négatif, c'est que je ne comprend pas pourquoi lorsque que je set la durée d'activation du compte il me compte toujours n-1 jour. Ce n'est pas dérangeant mais je trouve ça dommage.<br><br>Message édité par: Arkady910, à: 16/09/14 10:24

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 7 mois #18100 par Philippe
ca avance !! :)
n'oublie pas la gestion d'erreur execution :blink:
et la gestion de \&quot;masque\&quot; de saisie pour les erreurs de saisie ! :blush:

Le seul point négatif, c'est que je ne comprend pas pourquoi lorsque que je set la durée d'activation du compte il me compte toujours n-1 jour. Ce n'est pas dérangeant mais je trouve ça dommage.

la date donnée est la date d'expiration ou le compte sera désactivé (à 00h00 en début de journée)
si tu saisie le \&quot;12/02/2014\&quot; le compte est actif jusqu'au 11 février à 23h59, et à minuit il s'autodétruit. :woohoo: :evil:

pour la saisie tu peut utilisé la format Français si tu veux soit \&quot;18/11/2014\&quot; c'est plus simple que \&quot;Monday, November 18, 2014\&quot;
ou sinon en temps universel \&quot;2014-02-22\&quot;
tous c'est format de date sont accepter sans autre modif !

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.260 secondes
Propulsé par Kunena