如何向AD用户写入4个属性?

时间:2015-04-24 13:12:27

标签: vbscript

脚本应该这样做:

  1. 读取CSV文件:文件中有5个数据用于每个用户,数据用";"解析。每行Sp 5个数据,例如:aleroy;4181234567;2345678;;;

    您可以使用如下所示的行:aleroy;;;;;

    只有在文件中有一个数据时才会写入数据(第一个显然不计算,因为它是AD用户名)

  2. 就像我说的那样,如果文件中有数据,它将覆盖AD中的数据,否则,它将循环播放给下一个用户。
  3. 我不是程序员,所以我有很多问题让它起作用。我已经纠正了一些错误,.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
    

1 个答案:

答案 0 :(得分:0)

您正在将ADO Command对象传递给子例程,然后尝试在其上调用GetPut。这不起作用(你没有看到错误,因为你用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。它们将帮助您了解这些事情的工作原理。