脚本应该这样做:
读取CSV文件:文件中有5个数据用于每个用户,数据用";"解析。每行Sp 5个数据,例如:aleroy;4181234567;2345678;;;
。
您可以使用如下所示的行:aleroy;;;;;
。
只有在文件中有一个数据时才会写入数据(第一个显然不计算,因为它是AD用户名)
我不是程序员,所以我有很多问题让它起作用。我已经纠正了一些错误,.vbs现在正确运行,但在我的AD中没有写任何内容。
这是我制作的完整脚本。
Const FLAT_FILE_DELIMITER = ";"
Const ForReading = 1 'les modes d'ouverture possible du fichier
Const sdnDC = "DC=03QS,DC=LOCAL"'pour identifier le nom de domaine vers lequel on veut importer
Dim adoCSVConnection, adoCSVRecordSet, strPathToTextfile
'Où se trouve le fichier d'export
Dim FlatFilePath: FlatFilePath = "C:\ImportBottin.csv"
Dim strCSVFile
Dim FileSystem
Dim LigneCI
dim username, mobile, pager, telephonenumber, fax
'***************************************************************************
'On s'assure que le fichier de résultats a bien été généré et transféré
Set FileSystem = WScript.CreateObject("Scripting.FileSystemObject")
If FileSystem.FileExists(FlatFilePath) = FALSE then
Set FileSystem = Nothing
WScript.quit()
End if
'***************************************************************************
' Specify CSV file name.
Set objTextFile = FileSystem.OpenTextFile(FlatFilePath, ForReading)
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"
'***************************************************************************
Do While objTextFile.AtEndOfStream <> true
LigneCI = objTextFile.Readline
p1=Instr (LigneCI, FLAT_FILE_DELIMITER)
if p1 > 0 then
arr = Split(LigneCI, FLAT_FILE_DELIMITER)
If UBound(arr) = 4 Then
username = arr(0)
mobile = arr(1)
pager = arr(2)
telephonenumber = arr(3)
fax = arr(4)
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.CommandText = "<LDAP://"& sdnDC & _
">;(&(objectCategory=person)(objectClass=user)(userPrincipalName="& _
username &"));mobile,pager,telephonenumber,facsimileTelephoneNumber;subtree"
UpdateAD objCommand, mobile, pager, telephonenumber, fax
Else
WScript.Echo "ligne en erreur : " & csTR(LigneCI)
End If
end if
Loop
Sub UpdateAD (objAD,Cell,Page,Tel,Fax)
'Permet d'envoyer le bon attribut AD à la méthode AjoutAttribut
if not (Tel = "" or Tel = "NULL") then
AjoutAttribut objAD,"telephonenumber", Tel
end if
if not (Cell = "" or Cell = "NULL") then
AjoutAttribut objAD,"mobile",Cell
end if
if not (Page = "" or Page = "NULL") then
AjoutAttribut objAD,"pager",Page
end if
if not (Fax = "" or Fax = "NULL")then
AjoutAttribut objAD,"facsimileTelephoneNumber",Fax
end if
end sub
Sub AjoutAttribut (Obj,nomAttribut,Attribut)
'Méthode qui ajoute une valeur d'attribut à un objet de l'AD
On Error Resume Next
Err.Number=0
AttributAct=Obj.get(nomAttribut)
if strComp(Attribut,AttributAct,1)<>0 and Attribut <> "" and Attribut <> "NULL" then
Obj.Put nomAttribut,Attribut
end if
if Attribut <> "" and not isnull(Attribut) then
Obj.Put nomAttribut,Attribut
end if
end sub
答案 0 :(得分:0)
您正在将ADO Command对象传递给子例程,然后尝试在其上调用Get
和Put
。这不起作用(你没有看到错误,因为你用On Error Resume Next
来压制它。)
您需要Execute
AD查询才能实际检索用户/属性,然后遍历返回的列表:
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.CommandText = "<LDAP://"& sdnDC & _
">;(&(objectCategory=person)(objectClass=user)(userPrincipalName="& _
username &"));mobile,pager,telephonenumber,facsimileTelephoneNumber;subtree"
Set rs = objCommand.Execute
Do Until rs.EOF
UpdateAD rs, mobile, pager, telephonenumber, fax
rs.MoveNext
Loop
我认为您不能通过记录集更新用户属性。要更新属性,您需要通过其专有名称获取用户对象。您还需要调用SetInfo
以将更新的信息实际写回AD:
Set user = GetObject("LDAP://" & rs.Fields("distinguishedName").Value)
user.Put "mobile", "555-1234"
user.SetInfo
您可能需要查看ActiveXperts scripts for managing AD users。它们将帮助您了解这些事情的工作原理。