Inquiridor
Problemas no script.vbs Altera Atributo (Active Directory)

Pergunta
-
Boa Tarde Pessoal,
Estou tentando atualizar os atributos dos usuários do Active Directory utilizando script.vbs apartir de um arquivo CSV. O problema é que não está localizando o usuário no arquivo usermod.csv, alguém poderia me ajudar?
Abaixo segue informações:
Informações do arquivo usermod.csv:
User1,Office Bloguer
User2,Office Bloguer
Erro: Conta do usuario não encontrado
Linha:101
Script.vbs:
OPTION EXPLICIT ' Variáveis devem ser declaradas
' *************************************************
' * Instruções
' *************************************************' Modificar as variáveis na seção "Instalação" seção conforme exigido.
' Executar o script a partir de um prompt de comando no modo cscript.
' por exemplo: cscript usermod.vbs
' Você também pode escolher a saída dos resultados para um arquivo texto:
' cscript usermod.csv>> results.txt' *************************************************
' * Constantes / Declarações
' *************************************************
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Const ADS_PROPERTY_CLEAR = 1DIM strSearchAttribute
DIM strCSVHeader, strCSVFile, strCSVFolder
DIM strAttribute, userPath, csvHasHDR
DIM searchAttributePos,pos,userChanges
DIM cn,cmd,rs
DIM objUser
DIM oldVal, newVal
' *************************************************
' * Instalação
' *************************************************' O atributo do Active Directory que está a ser utilizado para combinar as linhas no arquivo CSV para
' Contas de usuário do Active Directory. É recomendado para uso exclusivo atributos.
' por exemplo: sAMAccountName (Pré login do Windows 2000) ou userPrincipalName
' Outros atributos podem ser usados, mas não estão garantidos para ser único. Se múltiplos utilizadores
' contas são encontrados, um erro é retornado e nenhuma atualização é realizada.
strSearchAttribute = "sAMAccountName" 'User Name (Pre Windows 2000)' Altere o cabeçalho CSV para corresponder ao seu arquivo CSV
' Ver para atribuir nomes http://www.wisesoft.co.uk/Scripts/activedirectoryschema.aspx
' O searchAttribute especificado acima deve aparecer na lista.
' Você pode entrar "nulo" para as colunas na csv que não estão a ser incluídas na atualização
'strCSVHeader = "sAMAccountName,givenName,initials,sn,displayName,description,physicalDeliveryOfficeName," & _
' "telephoneNumber,mail,wWWHomePage,cn"strCSVHeader = "sAMAccountName,physicalDeliveryOfficeName"
' CSV pasta onde está localizada
strCSVFolder = "C:\"
' Nome do Arquivo CSV
strCSVFile = "usermod.csv"
' Diz o texto CSV arquivo tem uma linha de cabeçalho? Opções: "Sim", "Não"
csvHasHDR = "No"' *************************************************
' * Validação
' *************************************************' Encontrar a posição da coluna, em busca atributo o arquivo CSV
searchAttributePos = -1
pos = 0
for each strAttribute in SPLIT(strCSVHeader,",")
if strAttribute = strSearchAttribute then
searchAttributePos = pos
end if
pos = pos + 1
next
' Assegure-se de procurar o atributo existe no cabeçalho CSV.
if searchAttributePos = -1 then
err.raise "'" & strSearchAttribute & "' atributo deve ser especificado no cabeçalho CSV." & _
vbcrlf & "Este atributo é usado para mapear os dados do arquivo csv para os usuários no Active Directory."
end if' *************************************************
' * Iniciar Script
' *************************************************' Configuração Conexão ADO para CSV
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strCSVFolder & ";" & _
"Extended Properties=""text;HDR=" & csvHasHDR & ";FMT=Delimited"""rs.Open "SELECT * FROM [" & strCSVFile & "]", _
cn, adOpenStatic, adLockOptimistic, adCmdText' Ler arquivo CSV
Do Until rs.EOF
' Receba as ADsPath do usuário procurando por um usuário no Active Directory em busca do atributo
' especificada, quando o valor for igual ao valor do csv.
' e.g. LDAP://cn=user1,cn=users,dc=wisesoft,dc=co,dc=uk
' por exemplo: LDAP://cn=user1,CN=Users,DC=wisesoft,dc=co,dc=uk
userPath = getUser(strSearchAttribute,rs(searchAttributePos))
' Verifique se um ADsPath foi devolvido
if LEFT(userPath,6) = "Error:" then
wscript.echo userPath
else
wscript.echo userPath
' Obter objeto do usuário
set objUser = getobject(userPath)
pos = 0
userChanges = 0
' Atualização cada atributo no CSV string
for each strAttribute in SPLIT(strCSVHeader,",")
oldval = ""
newval = ""
' Ignorar a pesquisa atributo (isto é apenas usada para procurar a conta do usuário)
if strAttribute <> strSearchAttribute and strAttribute <> "null" then
newVal = rs(pos) ' Obter novo valor do atributo arquivo CSV
if ISNULL(newval) then
newval = ""
end if' Especial para o manuseio atributo de nome comum. Se o novo valor contém
' vírgulas que deve ser precedido de uma barra.
if strAttribute = "cn" then
newVal = REPLACE(newVal,",","\,")
end ifIF LCASE(strAttribute) = "manager_samaccountname" THEN
' tratamento especial para permitir a atualização do gestor de atributo usando sAMAccountName (UserName)
' em vez de usar o nome distintoDIM objManager, managerPath
managerPath = GetUser("sAMAccountName",newVal)
IF LEFT(managerPath,6) = "Error:" THEN
wscript.echo "Error resolving manager DN:" & managerPath
' Definir oldval = newval (não atualização)
oldval = ""
newval = ""
ELSE
SET objManager = GetObject(managerPath)
newVal = objManager.Get("distinguishedName")
SET objManager = NOTHING
strAttribute = "manager"
on error resume next ' Ignorar erro, se é valor nulo
' Recebe antigos valores de atribuidos
oldVal = objUser.Get(strAttribute)
on error goto 0
END IF
ELSE
on error resume next ' Ignorar erro, se é valor nulo
' Recebe antigos valores de atribuidos
oldVal = objUser.Get(strAttribute)
on error goto 0
END IF
' Verifique se o valor tiver sido alterado
if oldval <> newval then
wscript.echo "Change " & strAttribute & " from '" & oldVal & "' to '" & newVal & "'"
if newval = "" then
' Tratamento especial para limpar um atributo
objUser.PutEx ADS_PROPERTY_CLEAR, strAttribute, null
else
SELECT CASE LCASE(strAttribute)
CASE "cn" 'Especial manipulação necessária para common-name atributo
DIM objContainer
set objContainer = GetObject(objUser.Parent)on error resume next
objContainer.MoveHere objUser.ADsPath,"cn=" & newval' A atualização pode falhar se um usuário comum, com o mesmo nome existe no anterior
' do mesmo recipiente (UO)
if err.number <> 0 then
wscript.echo "Erro comum mudando de nome a partir de '" & oldval & "' para '" & newval & _
"'. Verifique se o nome-do-comum é exclusivo dentro do recipiente (UO)"
err.clear
end if
on error goto 0
CASE ELSE ' Qualquer outro atributo
' Atualizar atributo
objUser.put strAttribute,newVal
END SELECT
end if
' Usado mais tarde para verificar se todas as alterações têm de ser cometida a AD
userChanges = userChanges + 1
end if
end if
' Informa a posição atual atributo na seqüência CSV
pos = pos + 1
next
' Verifique se precisamos de cometer quaisquer actualizações a AD
if userChanges > 0 then
' Script para permitir que se continue uma atualização falhar
on error resume next
err.clear
' Guarda as alterações para AD
objUser.setinfo
' Verifica se conseguiu atualizar/falhar
if err.number <> 0 then
wscript.echo "Commit Changes: Failed. " & err.description
err.clear
else
wscript.echo "Commit Changes: Succeeded"
end if
on error goto 0
else
wscript.echo "No Changes"
end if
end ifuserPath = ""
rs.MoveNext
Loop' Cleanup
rs.close
cn.close
' *************************************************
' * Funções
' *************************************************
Function getUser(Byval strSearchAttribute,strSearchValue)
' Função ADsPath para retornar à conta de um usuário através de pesquisas
' para um determinado valor atributo
' por exemplo: LDAP://cn=user1,cn=users,dc=wisesoft,dc=co,dc=ukDIM getUserCn,getUserCmd,getUserRS
on error resume next
set getUserCn = createobject("ADODB.Connection")
set getUserCmd = createobject("ADODB.Command")
set getUserRS = createobject("ADODB.Recordset")getUserCn.open "Provider=ADsDSOObject;"
getUserCmd.activeconnection=getUserCn
getUserCmd.commandtext="<LDAP://DC=XYP,DC=xxx,DC=xxx,DC=xx >;" & _
"(&(objectCategory=user)(" & strSearchAttribute & "=" & strSearchValue & "));" & _
"adsPath;subtree"set getUserRs = getUserCmd.execute
if getUserRS.recordcount = 0 then
getUser = "Erro: Conta do usuário não encontrado"
elseif getUserRS.recordcount = 1 then
getUser = getUserRs(0)
else
getUser = "Erro: Múltiplas contas de usuário encontrado. Espera uma conta de usuário."
end if
getUserCn.close
end function
Todas as Respostas
-
Boa Tarde !!
Eu estou tento o mesmo problema, peguei o script no site http://www.wisesoft.co.uk. Mas não consegui fazer funcionar.
Você achou o erro ??
Abraços e obrigado.