Tuesday, 17. November 2009, 07:29:46
active directory, visual basic script, nt, compte
...
Il arrive que pour des raisons de sécurité, une multitude de compte soient bloqués (Account is locked out) dans l’
Active Directory.
Il faut donc par la suite les débloquer et on ne dispose pas toujours d’une console etc. Et un script en
VBS peut nous aider.
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Début de la déclaration des variables
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = "Select AdsPath from 'LDAP://OU=Mes-Users,DC=Mon-Reseau,DC=Mon-Reseau-Connexion " & "where objectClass='user'"
Set objRecordSet = objCommand.Execute
'Fin de la déclaration des variables
'Compteur
monCompteur = 0
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'Sélection des comptes bloqués (boucle)
With objRecordSet
While Not .EOF
AdsPath = .Fields("AdsPath")
Set objItem = GetObject(AdsPath)
If objItem.IsAccountLocked = True Then ' True peut aussi avoir la valeur-1
' Routine pour débloquer les comptes'
objItem.isAccountLocked = 0 ' False
objItem.setInfo
'Fin de la routine pour débloquer les comptes
monCompteur = monCompteur + 1
Dim maVariable
If maVariable = "" Then
maVariable = objItem.sAMAccountName & " unlocked" & vbCRLF
else
maVariable = objItem.sAMAccountName & " unlocked" & vbCRLF & maVariable
End If
Else
'ADS_UF_LOCKOUT desactive
End If
.Movenext
Wend
End With
WScript.Echo Date() & vbTab & Time() & vbTab & "Nb. de compte désactivé:" & monCompteur & vbCRLF & _
"Liste des comptes désactivé: " & VbCRLF & maVariable
A lancer avec un compte administrateur et bien entendu il faut personnaliser le chemin
LDAP… Cela peut se faire via
Adsi Edit pour avoir le chemin complet !
Monday, 16. February 2009, 08:25:51
default gateway, vbs, passerelle par défaut, autoit
Il est parfois utile d'avoir la passerelle par défaut, que ce soit pour une installation logicielle, matérielle, ou tout autre objectif.
Mais comment déterminer celle-ci ?
Nous pouvons bien entendu le faire en VBS, mais aussi en AutoIt.
Exemple :
' VBS
strComputer = "." 'pour l ordinateur
Set WshShell = WScript.CreateObject("WScript.Shell")
' Set strComputer = WshShell.Environment("VOLATILE").Item("CLIENTNAME") 'pour environnement virtuel
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colAdapters = objWMIService.ExecQuery _
("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
For Each objAdapter in colAdapters
If Not IsNull(objAdapter.DefaultIPGateway) Then
For i = 0 To UBound(objAdapter.DefaultIPGateway)
WScript.Echo " Default gateway: " & objAdapter.DefaultIPGateway(i)
If objAdapter.DefaultIPGateway(i) = "192.168.1.6" Then
WScript.Echo "Votre Gateway : " & DefaultIPGateway(i)
End If
Next
End If
Next
Cela fonctionne à merveille. L'inconvéniant avec le VBS c'est les structures conditionnelles, et puis pourquoi le faire en VBS alors qu'on peux facilement
le faire en AutoIt ?
Exemple :
Func _get_default_gateway()
$output = _get_cmd_output("netstat -rn")
$arr = StringSplit($output, "0.0.0.0", 1)
$arr2 = StringStripWS($arr[3], 1)
$arr2 = StringSplit($arr2, " ")
Return $arr2[1]
EndFunc
Func _get_cmd_output($cmd)
$cmd_timeout = 2000
$pid = Run($cmd,@WorkingDir,@SW_HIDE,2)
$timer = TimerInit()
while (ProcessExists($pid))
sleep(50)
If TimerDiff($timer) > $cmd_timeout Then ProcessClose($pid)
WEnd
$output = StdoutRead($pid)
Return StringStripCR($output)
EndFunc
Pour avoir la valeur, une simple boite de dialogue et le tour est joué :
Dim $i
$i = _get_default_gateway()
MsgBox(0, "","Votre passerelle : " & $i)
La structure conditionnelle (si plusieurs passerelles sont possible) est faisable hors de la fonction
Wednesday, 28. May 2008, 09:01:18
active directory, xcacls, microsoft, dos
...
Alors que je viens d'éditer un billet sur comment changer les propriétés et sécurités d'un dossier ou fichier via la commande CACLS, j'ai oublié de compléter mon billet par le fait qu'il est tout à fait possible via d'autres outils intégré à l'Active Directory.
Cela peut se faire via
SUBINACL...
Mais nous avons aussi d'autres outils mis à notre disposition :
Et j'en passe...
Pourquoi me suis-je cassé la tête avec tout ce charabia de commande ?
Monday, 11. February 2008, 19:48:22
ms-dos, vbs, variable
Après quelques instant de repos, un retour en douceur…
J’ai eu il y a quelques temps une question sur laquelle j’ai cherché pendant pas mal de temps une solution :
Passer des paramètres de fichier BATCH en fichier BATCH ou de fichier BATCH vers un fichier BATCH… Mais que le dernier qui était lancé renvoyait la valeur des variables mandées vers le premier.
Partageons donc la solution :
Le BATCH
@ECHO OFF
CLS
ECHO ---------------------------------
ECHO Variables
ECHO ---------------------------------
ECHO Fichier : %~s0
ECHO Utilisateur : %1
ECHO (Vide au lancement du BATCH)
ECHO Password : %2
ECHO (Vide au lancement du BATCH)
PAUSE
WSCRIPT.EXE MSG.VBS %~s0
EXIT
Et le VBS :
' Passage de Variable BATCH VBS BATCH
' v0.3.19 (c) Groumphy
' Pose des variables
Dim Variable, UserName, Password, Executable
' Récupération du premier argument passé dans le VBS
' par le BATCH. Ligne de commande :
' WSCRIPT.EXE MSG.VBS Argument
Variable = wscript.arguments(0)
'Exposition de la variable récupérée
WScript.Echo "La variable est : " & Variable
' Demande du nom d'utilisateur par InputBox
UserName = InputBox("Quel est le nom d'utilisateur ?")
' Si le nom d'utilisateur est vide
If IsNull(UserName) Then
' Message d'information d'erreur
MsgBox "Erreur - Nom d'utilisateur incorrect."
' Sinon lancement de la suite de la procédure
Else
' Demande du mot de passe par InputBox
Password = InputBox("Quel est le mot de passe associé au nom d'utilisateur " & UserName)
' Si le mot de passe est vide
If IsNull(Password) Then
' Message d'information d'erreur
MsgBox "Erreur - Mot de passe incorrect."
' Sinon poursuite de la procédure
Else
' Affichage de la variable, du nom d'utilisateur et du mot de passe
WScript.Echo Variable & " " & UserName & " " & Password
' Définition de la variable en tant qu'objet du Shell
Set Executable = CreateObject("WScript.Shell")
' Lancement de l'objet Shell contenant la variable, le nom
' d'utilisateur et le mot de passe
Executable.Run Variable & " " & UserName & " " & Password
End If
End If
Comme d’habitude j’ai commenté la source … Rien de bien extraordinaire, mais j’ai été surpris de ne pas encore voir la solution dans beaucoup de forum.
Maintenant cela peut être utile.
Bien entendu le BATCH peut avoir une forme différente. Nous pourrions utiliser une petite ligne supplémentaire telle que :
SET TEST=%1
IF NOT DEFINED TEST1 GOTO END
Et juste avant la sortie du script :
:END
EXIT
Cela fermera le script si la variable renvoyée est vide…
Plutôt simple non ?
Friday, 14. September 2007, 09:27:02
cvswrapper, cvs, winmerge, active directory
...
Je l'avais
promis, voici le « feedback » du pourquoi du comment que j'utilise
AutoIt.
Le but initial était d'avoir un langage de script performant et non dépendant de l'éditeur du système d'exploitation Microsoft (sinon j'aurais pris VBS) afin d'automatiser simplement certaines actions sur le PC, le réseau, l'AD.
J'ai bien entendu cherché divers languages (aussi au niveau BATCH), mais je suis rapidement tombé sur le charme de AutoIt car il permettais non seulement d'être son propre language, mais aussi de la combiner avec d'autres (notament le VBS, les DLL et les ActiveX).
Je l'ai donc installé sur un PC portable de type ACER 1700 sous Microsoft Windows XP et l'installation s'est déroulée sans incident particulier. D'ailleur les installeurs sont fait via des logiciels libres (NSIS de NullSoft). Le language se « décompose » en 3 ou 5 paquets selon ce que l'on désire : le language seul (version production et beta) avec son éditeur (SciTE), le language (production et beta), l'éditeur (SciTE), le CVS (CVSWrapper Add-on) accompagné de Tortoise et le dernier package WinMerge qui permet de faire les comparaisons de fichiers.
J'ai choisis en premier temps la « version 3 paquets », et suis passé rapidement à la version 5 paquets car je la trouvais très pratique !
L'éditeur SciTE remplit parfaitement son role avec une aide syntaxique, une aide (fichier CHM) relié à la touche F1, etc. et se montre très (voir trop) complet (mais c'est aussi personnalisable). Bien entendu les autres logiciels sont parfaitement intégré et s'ouvrent en nouvelle fenêtre ; un petit inconvéniant toutefois devant la multitude de fenêtre.
Il a parfaitement remplis ses fonctions jusqu'à maintenant mais les a aussi remarquablement dépassé car dans sa v3 (actuelle) il permet d'avoir des GUI et donc de faire des applications complètes (exécutable etc.).
Je le considère donc autrement qu'un language script mais bien comme un language complet ! Et je ne compte pas m'en séparer de si tôt !