Question Comparer user et computer dans active directory

Plus d'informations
il y a 10 ans 8 mois #20472 par Fred
Bon bon bon ...je pense que je vais encore avoir besoin d'eclaircissements :S
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 ;) et dedans tu indiques qu'il est possible de transformer une variable en string avec l'opérateur +

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.

Plus d'informations
il y a 10 ans 8 mois #20474 par Laurent Dardenne
fred31200 écrit:

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)?

Un exemple sera plus simple il me semble :
[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:

je ne sais comment le vérifier

[code:1]
#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:

dedans tu indiques qu'il est possible de transformer une variable en string avec l'opérateur +

En Powershell l’ordre des opérandes, surtout leur type, influe sur l'opération :
[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.

Plus d'informations
il y a 10 ans 8 mois #20475 par Fred
Merci pour toutes les infos que tu m'apportes ... ca me permet de commencer a comprendre un peu le raisonnement.
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 \&quot;TTL=\&quot; &gt;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 \&quot;%value%\&quot;==\&quot;6\&quot; goto flag3
if \&quot;%value%\&quot;==\&quot;7\&quot; 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
Pièces jointes :

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

Plus d'informations
il y a 10 ans 8 mois #20476 par Laurent Dardenne
fred31200 écrit:

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.

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é.
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:

Je sais que j'utilise du code qui date de l'époque des dinosaures

Pour moi la question n'est dans le fait que cela date, mais dans les possibilités proposées.

Tutoriels PowerShell

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

Plus d'informations
il y a 10 ans 8 mois #20479 par Fred
Pour les logiciels je me suis penché sur la question seulement en logiciels gratuit je n'ai trouvé que ultrabackup qui n'est plus compatible avec win7 et la nouvelle version propose d'envoyer nos données sur un cloud (le milieu dans lequel je travaille ne peut se permettre d'envoyer des données sensibles sur un nuage).
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.

Plus d'informations
il y a 10 ans 8 mois #20480 par Laurent Dardenne
fred31200 écrit:

Pour les logiciels je me suis penché sur la question

je parlais de prg externes, du type IpConfig.exe
fred31200 écrit:

Si tu me confirme que la commande break fonctionne,

Break pour Powershell ou pour un batch ?
Remplace Break par un goto + label
fred31200 écrit:

il ne doit pas y avoir de raison que mon script n'aboutisse pas

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 mur :)

Je ne sais pas comment tu procèdes pour le faire tourner sans pb :ohmy:

Tutoriels PowerShell

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

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