Question
Comparer user et computer dans active directory
- Fred
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 22
- Remerciements reçus 0
Dans mon script, je tentait d'indiquer que si le nom du user apparait dans le champs description du computer de active directory, tu continues le script (goto flagX ?)
et sinon (goto fin).
Si je comprend bien le code que tu m'as généreusement proposé, tu indiques que si DUPONT Stéphane apparait dans le résultat de la comparaison entre les chaines de caracteres description et username = cela retourne la valeur true
mais que si c'est DUPONT RObert = cela retourne la valeur false.
J'ai donc remplacé pour le 1er cas DUPONT Stéphane par ma variable ce qui donne :
[code:1] #insensible à la casse
'description *--'.IndexOf('username', [System.StringComparison]::O
rdinalIgnoreCase) -gt 0
#True [/code:1]
par contre j'ai 2 problemes :
1 - Qu'est-ce que je dois mettre pour que la valeur retourne false ? j'avais pensé mettre \"*\" pour indiquer toutes les valeurs différentes de \"username\" mais je pense que c'est erroné puisque \"username\" fait parti de *
2 - Comment utiliser les valeurs true et false ? je peux faire un if true (goto flag1) else (goto fin)?
D'autre part pour le résultat de mes variables tu me dis que c'est possible seulement si elle sont de type string ... je ne sais comment le vérifier mais je suis tombé sur un post sur un autre forum ou tu sévis
voila le post en question avec ta réponse a 16h37:
www.developpez.net/forums/d1396683/gener...voie-1-j-ai-espaces/
Cordialement.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Un exemple sera plus simple il me semble :1 - Qu'est-ce que je dois mettre pour que la valeur retourne false ?
2 - Comment utiliser les valeurs true et false ? je peux faire un if true (goto flag1) else (goto fin)?
[code:1]
$UserName='MOI'
$Description=\"description ${username}--\"
$isMyComputer=$Description.IndexOf($UserName, [System.StringComparison]::OrdinalIgnoreCase) -gt 0
#true
if ($isMyComputer) {Write-Host \"Exécute la sauvegarde\"} else {Write-Host \"N'exécute pas la sauvegarde\"}
#OK
#La description n'a pas changé
$UserName='LUI'
$isMyComputer=$Description.IndexOf($UserName, [System.StringComparison]::OrdinalIgnoreCase) -gt 0
#False
if ($isMyComputer) {Write-Host \"Exécute la sauvegarde\"} else {Write-Host \"N'exécute pas la sauvegarde\"}
#NOK
[/code:1]
fred31200 écrit:
[code:1]je ne sais comment le vérifier
#affiche le type
$UserName.GetType()
$Description.GetType()
$isMyComputer.GetType()
#test si la variable est d'un type attendu
$UserName -is [string]
#true
$UserName -is [System.Diagnostics.Process]
#false
[/code:1]
Mais dans ton cas une fois que tu connais le type, tu n'as plus besoin de le tester dans le code, c'est juste pour l'exploration des données AD.
fred31200 écrit:
En Powershell l’ordre des opérandes, surtout leur type, influe sur l'opération :dedans tu indiques qu'il est possible de transformer une variable en string avec l'opérateur +
[code:1]
'string' + 10
#string10
10+'string'
#Erreur : Impossible de convertir la valeur «string» en type «System.Int32»....
[/code:1]
cela dépend de ce que tu manipules, mais pour le moment oublie ce point.
La présence de la méthode Indexof dans le code cité peut être confus, mais sache que je n'y référence pas la méthode IndexOf de la classe String :
[code:1]
[string]$s='test'
$S|get-member -Name index*
# TypeName : System.String
#
# Name MemberType Definition
# ----
# IndexOf Method int IndexOf(char value), int IndexOf(char value, int startIndex), int IndexOf(char value, int ...
# IndexOfAny Method int IndexOfAny(char[] anyOf), int IndexOfAny(char[] anyOf, int startIndex), int IndexOfAny(cha...
$T=new-object system.Collections.Arraylist(,(1..3))
,$T|get-member -Name index*
# TypeName : System.Int32[]
#
# Name MemberType Definition
# ----
# IndexOf Method int IList.IndexOf(System.Object value)
[/code:1]
{edit]
Corrections autour de .GetType() -IS<br><br>Message édité par: Laurent Dardenne, à: 21/07/15 12:44
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Fred
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 22
- Remerciements reçus 0
Alors j'ai avancé un peu et j'ai persisté sur la piste d'avoir un type string pour mes résultats.
Au départ j'avais un résultat avec mes variables de type PSCustomObject
J'ai trouvé comment transformer ce résultat en type string avec la méthode out-string et ça fonctionne ($Description=.GetType() me retourne bien string comme valeur).
je pensais ainsi que ton code permettrait de faire plus facilement la comparaison de chaine.
Par contre le fait que mon script soit un batch doit poser problème pour la suite car je n'arrive pas a appliquer le if else.
Voici mon batch complet pour que tu vois ou j'en suis.
Je sais que j'utilise du code qui date de l'époque des dinosaures mais il fonctionne pour les autres parties comme le test du ping et la sauvegarde
[code:1]REM
# test de la connexion au serveur #
ping -n ipdemonserveur | find \"TTL=\" >nul
if errorlevel 1 (goto fin) else (goto flag1)
:flag1
REM
# verifier concordance user et computer dans AD #
powershell Import-Module ActiveDirectory
$description=Get-ADComputer $env:computername -properties * | select description | out-string
$username=Get-ADUser $env:username -properties * | select Name | out-string
$ismycomputer=$description.IndexOf($username, [System.StringComparison]::OrdinalIgnoreCase) -gt 0
if ($ismycomputer) {break :flag2} else {break :fin}
:flag2
REM
# message voulez-vous sauvegarder? #
wscript //nologo message.vbs
set value=%errorlevel%
if \"%value%\"==\"6\" goto flag3
if \"%value%\"==\"7\" goto fin
:flag3
REM
# creation chemin de sauvegarde #
$username=%USERNAME%
$destination=E:\Sauvegarde\%USERNAME%
if exist destination (goto flag4)
powershell new-item -path E:\Sauvegarde\%USERNAME% -name $username -itemtype directory
:flag4
#Sauvegarde Mes Documents #
SET FICHIERS=*.*
SET SOURCE=%HOMEDRIVE%\%HOMEPATH%\Documents
SET DESTINATION=E:\Sauvegarde\%USERNAME%\Documents
robocopy %SOURCE% %DESTINATION% %FICHIERS% /MIR /COPYALL /sec
# Sauvegarde Favoris #
SET SRC=%HOMEDRIVE%\%HOMEPATH%\Favorites
SET DEST=E:\Sauvegarde\%USERNAME%\Favorites
robocopy %SRC% %DEST% %FICHIERS% /MIR /COPYALL /sec
# Sauvegarde Bureau #
SET SRC=%HOMEDRIVE%\%HOMEPATH%\Desktop
SET DEST=E:\Sauvegarde\%USERNAME%\Desktop
robocopy %SRC% %DEST% %FICHIERS% /MIR /COPYALL /sec
# envois mail en fonction de du code erreur #
if %errorlevel% == 0 (goto ok)
powershell Send-MailMessage -to Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. -subject PROBLEME_sauvegarde_nok -body Erreur:_%errorlevel% -from $env:username@mondomaine.fr -SmtpServer smtpint.mondomaine.net
goto fin
:ok
powershell Send-MailMessage -to Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. -subject sauvegarde_ok -body $env:username -from $env:username@mondomaine.fr -SmtpServer smtpint.mondomaine.net
:fin
[/code:1]
Je pense que ça bloque au niveau de l'instruction break ... je pensais que c'était la version powershell du goto mais ... apparemment pas.
Message édité par: fred31200, à: 16/07/15 11:13
Message édité par: fred31200, à: 16/07/15 11:18
Message édité par: fred31200, à: 16/07/15 11:21<br><br>Message édité par: fred31200, à: 16/07/15 11:33
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
On peut effectivement utiliser des programme externe afin d'éviter de réinventer la roue, mais de mélanger les deux approches au sein d'un même script me semble erroné.Par contre le fait que mon script soit un batch doit poser problème pour la suite car je n'arrive pas a appliquer le if else.
Pour le if/else, break ce sera possible à partir de Powershell. Ensuite je ne sais pas s'l y a des transformations de données entre powershell.exe et cmd.exe
fred31200 écrit:
Pour moi la question n'est dans le fait que cela date, mais dans les possibilités proposées.Je sais que j'utilise du code qui date de l'époque des dinosaures
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Fred
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 22
- Remerciements reçus 0
Il y a aussi Cobian mais il ne propose pas la sauvegarde a la fermeture de session.
Si tu me confirme que la commande break fonctionne, il ne doit pas y avoir de raison que mon script n'aboutisse pas ... je continues a chercher et je te remercie infiniment pour le temps que tu m'as déja consacré et d'avoir orienté mes recherches.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
je parlais de prg externes, du type IpConfig.exePour les logiciels je me suis penché sur la question
fred31200 écrit:
Break pour Powershell ou pour un batch ?Si tu me confirme que la commande break fonctionne,
Remplace Break par un goto + label
fred31200 écrit:
J'ai essayé rapido ton script, en le modifiant, en .ps1 le if errorlevel clôt la discussion et en .cmd la déclaration de variable de type $Nom provoque des erreurs de syntaxe, il va certes plus loin, mais tjr dans le muril ne doit pas y avoir de raison que mon script n'aboutisse pas
Je ne sais pas comment tu procèdes pour le faire tourner sans pb
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Comparer user et computer dans active directory