2014-05-05 3 views
0

J'ai un script qui doit copier la valeur Description à Department. Mais le script ne semble fonctionner qu'à 50%. J'ai OU, et il y a 3 sous OU. Le script ne modifie que les premiers attributs OU, mais pas les 2 autres. Quelqu'un pourrait-il vérifier le script et me dire ce qui ne va pas?Active Directory Copier les attributs utilisateur

Script:

Option Explicit 

On Error Resume Next 
Dim objUser, objChild, objConnection, objRootDSE, objItem 
Dim WshShell, objFSO, strRoot, strDNSDomain, strContainer 
Dim strDescription, strsAMAccountName 
Dim strdepartmentAfter, strDirectory, strdepartmentBefore 
Dim i, intLogFlag 'no log exists 

i=1 
intLogFlag = 0 

Set WshShell = CreateObject("WScript.Shell") 

'Set current directory to Desktop & display on page 
strDirectory = WshShell.SpecialFolders("Desktop") & "\" 
Set objRootDSE = GetObject("LDAP://RootDSE") 
strDNSDomain = objRootDSE.Get("DefaultNamingContext") 
strContainer = strContainer & strDNSDomain 
'To do a subcontainer, add it after//ou=OUName, - include comma 
Set strRoot =GetObject("LDAP://OU=Kasutajad," & strDNSDomain) 
'Start Logging 
CreateLog() 
'**************************************************************** 
For each objChild in strRoot 
Select Case objChild.class 
Case "organizationalUnit","container" 
Call DATree 
End Select 
Next 

Sub DATree() 
OU.Filter="objectClass=user" 
For each user in OU 
If user.class="user" Then 
    On Error Resume Next 
    user.Department=user.description 
    If Err.Number = 0 Then 
     user.SetInfo 
     WScript.Echo "Copied:" & user.description & " for " & user.name 
    Else 
     On Error GoTo 0 
     WScript.Echo "No IPPHONE configured for " & user.name 
    End If 
    On Error GoTo 0 
end if 
i=i+1 
next 
End Sub 

i = i -1 
Wscript.Echo "Accounts = " & i 
Wscript.Quit 

'**************************************************************** 

Sub CreateLog() 
On Error Resume Next 
Dim objFile 
Dim strFile, strText 

'Create log file 
strFile = "UserDepartmentLog_" & Month(Date()) & "_" & Day(Date()) & ".txt" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.CreateTextFile(strDirectory & strFile) 
Set objFile = Nothing 
'Write headers to the log file 
strText = "User Name,Date,Description,Department Before, Department After" 
Set objFile = objFSO.OpenTextFile(strDirectory & strFile, 8, True) 
objFile.WriteLine(strText) 
intLogFlag = 1 
Set objFSO = Nothing 
Set objFile = Nothing 
End Sub 

'**************************************************************** 

'Used to append the log for each computer the script is run against 

Sub WriteLog(strdescription, strAccountName, strDeptBefore, strDeptAfter) 
On Error Resume Next 
Dim objFile, objTextFile 
Dim strFile, strText 

strFile = "UserDepartmentLog_" & Month(Date()) & "_" & Day(Date()) & ".txt" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
'Check to see if the log exists 
If intLogFlag = 1 Then 
'Write to the log 
strText = strAccountName & "," & Date() & "," & strDescription & "," & strDeptBefore &       "," & strDeptAfter 

Set objFile = objFSO.OpenTextFile(strDirectory & strFile, 8, True) 
objFile.WriteLine(strText) 
objFile.Close 
'Reset strText for later use 
strText = "" 
Else 'If the log doesn't exist, create it 
CreateLog() 
'Reset strText for later use 
strText = "" 
End If 
Set objTextFile = Nothing 
Set objFile = Nothing 
Set objFSO = Nothing 
End Sub 

Répondre

0

Je vous suggère de fossé VBScript et passer à PowerShell. Tout cela peut être remplacé par ce (sur une seule ligne):

Get-ADUser -SearchBase 'OU = Test PowerShell, DC = yourdom' -LDAPFilter '(sAMAccountName = *)' Description -Properties | ForEach-Object {Set-ADUser $ _ $ _ -Direction. Description}

Tout ce que vous devez faire est PowerShell 2.0 (de préférence 3,0 mais parce qu'il est beaucoup plus facile) et le Active Directory Module on your client.

Espérons que la commande soit suffisamment détaillée pour que la plupart des choses se passent bien. La chose à savoir est que les commandes PowerShell ont tendance à renvoyer des objets *, plutôt que du texte. Le | est un tube, donc les objets de sortie de la première commande (Get-ADUser) sont envoyés à la deuxième commande (ForEach-Object). Et $ _ représente l'objet dans le pipeline. Donc, à l'intérieur des accolades, je fais un Set-ADUser (Set est le verbe standard de PowerShell pour la mise à jour) sur l'objet dans le pipeline, en appliquant la valeur de l'attribut description de l'objet dans le pipeline à la propriété -Department. Ta da!

Ceci est connu comme une doublure PowerShell. Je pourrais avoir écrit comme un script et peut-être ai regardé comme ceci:

$users = Get-ADUser ` 
    -SearchBase 'OU=PowerShell Testing,DC=yourdom' ` 
    -LDAPFilter '(sAMAccountName=*)' -Properties description 

foreach ($user in $users) 
{ 
    Set-ADUser $user -Department $user.description 
} 

Le `est le caractère de continuation de PowerShell. Je faisais beaucoup de VBScripting - j'avais des scripts avec des milliers de lignes de code. Maintenant, je ne le toucherais pas avec une péniche, si j'avais le choix.

Questions connexes