Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    5

    Script import user Active directory

    Premetto che non sono un programmatore e che ,anche se mi piacerebbe,non ne sò nulla.
    Il mio problema è che ho uno script in perl che deve girare su Windows 2003 64 bit per esportare in un file ldfi (formato per OpenLDAP)gli utenti di Active Directory.
    Lo script funziona ed inserisce anche gli hash delle password di tutti gli utenti precedentemente esportate su un file di testo con pwdump.
    Il problema è che inserisce degli spazi e dei caratteri asci che non centrano nulla e che fanno fallire l'importazione del fiel ldfi.
    Ho provato sia installando Active-Perl che Strawberry-Perl su windows 2003 ottenendo gli stessi risualtati,ho provato a fare dei cambiamenti allo script ma nulla.
    Questo è lo script che si chiama migrate.pl
    codice:
    # Copyright (c) 2000, Norbert Klasen.
    # All rights reserved.
    #
    # Redistribution and use in source and binary forms, with or without
    # modification, are permitted provided that the following conditions are met:
    # o Redistributions of source code must retain the above copyright notice,
    # this list of conditions and the following disclaimer.
    # o Redistributions in binary form must reproduce the above copyright
    # notice, this list of conditions and the following disclaimer in the
    # documentation and/or other materials provided with the distribution.
    # o Neither the name of the Universitaet Tuebingen nor the names of its
    # contributors may be used to endorse or promote products derived from
    # this software without specific prior written permission.
    
    
    use strict;
    use Getopt::Std;
    use vars qw/ $opt_u $opt_g $opt_d $opt_s $opt_b $gidNumber $homeDirectoryBase $loginShell $basedn/;
    
    if (!getopts('uig:d:s:b:'))
    {
    print "migrate_pwdump: converts Windows SAM dump to rfc2307 ldif file\n";
    print "usage: [-u] [-g group] [-d homebase] [-s shell] [-b basedn] pwdump-file\n";
    print " -u generate ldif file for changing userPassword attribute only\n";
    exit;
    }
    
    if ( $opt_g ) {
    $gidNumber = $opt_g;
    } else {
    $gidNumber = 100;
    }
    
    if ( $opt_d ) {
    $homeDirectoryBase = $opt_d;
    } else {
    $homeDirectoryBase = "/home/";
    }
    
    if ( $opt_s ) {
    $loginShell = $opt_s;
    } else {
    $loginShell = "/bin/bash";
    }
    
    if ( $opt_b ) {
    $basedn = $opt_b;
    } else {
    $basedn = "ou=Users,dc=test,dc=net";
    }
    
    
    while ( <> ) {
    my ($name, $uidNumber, $lanmanger_hash, $nt_hash, $account_flags, $last_change_time, $remainder) = split /:/, $_;
    next if $name =~ /\$$/; #computer accounts shouldn't be included
    print "dn: uid=$name,$basedn\n";
    if ( $opt_u ) {
    print "changetype: modify\n";
    print "replace: userPassword\n";
    print "userPassword: {lanman}$lanmanger_hash\n";
    } else {
    print "objectclass: top\n";
    print "objectclass: account\n";
    print "objectclass: posixAccount\n";
    #posixAccount MUST
    print "cn: $name\n";
    print "uid: $name\n";
    print "uidNumber: $uidNumber\n";
    print "gidNumber: $gidNumber\n";
    #print "homeDirectory: $homeDirectoryBase$name\n";
    #posixAccount MAY
    print "userPassword: {lanman}$lanmanger_hash\n";
    #print "loginShell: $loginShell\n";
    }
    print users "\n";
    }
    e dando questo comando
    codice:
    migrate.pl -b dc=test,dc=net pwd.txt > users.ldif
    Dove pwd.txt è il file di testo con gli hash delle password degli utenti ottengo un file dove i valori presi letti o da active directory o dal file con gli hash,hanno degli spazi per esempio il file letto su linux con nano riporta questo.
    codice:
    dn: uid=��k^@i^@o^@t^@^@r^@o^@o^@t^@,dc=test,dc=net
    objectclass: top
    objectclass: account
    objectclass: posixAccount
    cn: ��k^@i^@o^@t^@o^@r^@o^@o^@t^@
    uid: ��k^@i^@o^@t^@o^@r^@o^@o^@t^@
    uidNumber: ^@5^@0^@0^@
    gidNumber: 100
    userPassword: {lanman}^@8^@0^@2^@5^@6^@3^@F^@C^@E^@4^@C^@8^@4^@4^@F^@2^@B^@5^@B^@3^@9^@7^@F^@3^@F^@C^@6^@8^@C^@3^@C^@C^@
    
    dn: uid=^@G^@u^@e^@s^@t^@,dc=test,dc=net
    objectclass: top
    objectclass: account
    objectclass: posixAccount
    cn: ^@G^@u^@e^@s^@t^@
    uid: ^@G^@u^@e^@s^@t^@
    uidNumber: ^@5^@0^@1^@
    gidNumber: 100
    userPassword: {lanman}^@N^@O^@ ^@P^@A^@S^@S^@W^@O^@R^@D^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@
    
    dn: uid=^@k^@r^@b^@t^@g^@t^@,dc=test,dc=net
    objectclass: top
    objectclass: account
    objectclass: posixAccount
    cn: ^@k^@r^@b^@t^@g^@t^@
    uid: ^@k^@r^@b^@t^@g^@t^@
    uidNumber: ^@5^@0^@2^@
    gidNumber: 100
    userPassword: {lanman}^@N^@O^@ ^@P^@A^@S^@S^@W^@O^@R^@D^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@*^@
    La cosa strana è che dove con nano vedo ^@ con altri editor vedo un quadrato,con altri uno spazio vuoto....
    Se qualcuno mi potesse dare una mano......

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non so risponderti su come funzioni il programma, ma riesco a fare un commento sul carattere ^@.
    E` il carattere NULL, ovvero 0x00 . Nel linguaggio C viene usato come terminatore di stringa.
    Nessuna meraviglia che venga visualizzato in modo diverso in sistemi diversi: qualche sistema mette un rettangolo dove non sa come visualizzare, qualche altro mette uno spazio.
    In qualche sistema (ma non in tutti, se ricordo bene) viene usato per introdurre caratteri formati da due byte (quindi oltre i 256 dell'ASCII esteso).

    Per poter fare una diagnosi precisa, dovresti confrontare i file aprendoli con un editor binario (o esadecimale). In tutti ii sistemi ce ne sono. In linux io ho Khexedit, ma ho visto qualcosa anche in windows (non ricordo il nome).
    Con tale sistema riesci a confrontare i file (devi verificare cosa esattamente contengono nei punti "critici"), e verifica se ci sono effettivamente caratteri diversi.

    Il problema non sta nel linguaggio usato; potrebbe stare nel sistema operativo (o nei daemon di interfaccia).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    5
    Prima di tutto grazzie della risposta....il problema è che "quei terminatori di stringa" proprio non dovrebber esserci e non ho la minima idea del perchè lo script (o l'interprete perl)ce le vada a mettere.
    Per provare ad essere più chiaro...
    Questo
    codice:
    dn: uid=��k^@i^@o^@t^@^@r^@o^@o^@t^@,dc=test,dc=net
    objectclass: top
    objectclass: account
    objectclass: posixAccount
    cn: ��k^@i^@o^@t^@o^@r^@o^@o^@t^@
    uid: ��k^@i^@o^@t^@o^@r^@o^@o^@t^@
    uidNumber: ^@5^@0^@0^@
    gidNumber: 100
    userPassword: {lanman}^@8^@0^@2^@5^@6^@3^@F^@C^@E^@4^@C^@8^@4^@4^@F^@2^@B^@5^@B^@3^@9^@7^@F^@3^@F^@C^@6^@8^@C^@3^@C^@C^@
    Dovrebbe venire fuori così :
    codice:
    dn: uid=kiotroot,dc=test,dc=net
    objectclass: top
    objectclass: account
    objectclass: posixAccount
    cn: kiotoroot
    uid: kiotoroot
    uidNumber: 500
    gidNumber: 100
    userPassword: {lanman}802563FCE4C844F2B5B397F3FC68C3
    Ho il timore che sia la funzione "split" ad essere il problema,ma non so come gestirla....

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    A me lo split sembra a posto.
    La mia impressione e` che quei caratteri ci siano nel file sorgente (forse il sistema che lo genera ha i caratteri a 16 bit (anziche` ad 8), e quindi i byte in piu` sono dovuti a quello.

    Prova a fare una cosa di questo tipo:
    codice:
    while ( <> ) {
      my $tmp = $_;
      print "lunghezza char ".length $tmp."\n";
      print "lunghezza byte ".do { use bytes; length $tmp }."\n";   # non lo ho testato - preso ora dal man 
    
      for (my $i=0; $i<length $tmp; $i++) { printf "%c ", substr($tmp, $i, 1); } print "\n" 
      my ($name, $uidNumber, $lanmanger_hash, $nt_hash, $account_flags, $last_change_time, $remainder) = split /:/, $tmp;
      next if $name =~ /\$$/; #computer accounts shouldn't be included
      print "dn: uid=$name,$basedn\n";
      if ( $opt_u ) {
        print "changetype: modify\n";
        print "replace: userPassword\n";
        print "userPassword: {lanman}$lanmanger_hash\n";
      } ... ecc
    }
    Ho salvato $_ in una variabile perche` le operazioni successive potrebbero sovrascriverlo

    Vedi anche se il tuo programma definisce il sistema di caratteri (unicode o ASCII), se non lo fa, forse dovresti farlo (aggiungere use bytes; / use unicode; (non conosco la sintassi esatta) all'inizio del programma
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    5
    Originariamente inviato da Mich_
    ..........
    La mia impressione e` che quei caratteri ci siano nel file sorgente (forse il sistema che lo genera ha i caratteri a 16 bit (anziche` ad 8), e quindi i byte in piu` sono dovuti a quello.

    .......
    E infatti avevi ragione ho semplicemnete copiato il contenuto del file con gli hash delle password e salvato con codifica "ANSI" e tutto è andato OK.
    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.