Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3401[/thread]

Perl & win32 ADS user management: win32::AD::user

Leser: 2


<< >> 9 Einträge, 1 Seite
Gast Gast
 2004-02-10 12:34
#35973 #35973
hallo gemeinde :)

brauch eine kleine start hilfe

ich möchte ein script schreiben um user ins activ directory
hinzu zufügen

suche dazu sample code oder howtos :) am besten in deutsch
english ist aber auch net schlimm konnte bisher nix finden

bin für jede hilfe dankbar

thx
fboneol
 2004-02-10 16:52
#35974 #35974
User since
2003-09-12
32 Artikel
BenutzerIn
[default_avatar]
Aus dem oreilly buch perl für systemadministration :

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl -w
#
# Globalen Benutzer im Active Directory erzeugen
#
use strict;
use Win32::OLE;
my($username, $commonname, $fullname) = @ARGV or die "Aufruf: $0 user \"CN\" \"Voller Name\"\n";

my $ADsPath = "LDAP://CN=Users,dc=watz,dc=ee,dc=ethz,dc=ch";

my $c = Win32::OLE->GetObject($ADsPath) or die "Fehler bei Get $ADsPath\n";

# Benutzerkonto-Objekt erzeugen.
my $u = $c->Create("user", "cn=" . $commonname);
$u->{samAccountName} = $username;
# Benutzerkonto muß existieren, bevor es verändert werden kann.
$u->SetInfo();

# Der FullName heißt manchmal auch Display Name.
$u->{'FullName'} = $fullname;
$u->SetInfo();


--------------------------------------
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl -w
#
# Benutzer mit vollem Namen erzeugen
#
use strict;
use Win32::OLE;
my($username, $fullname) = @ARGV or die "Aufruf: $0 user \"Voller Name\"\n";

my $ADsPath = "WinNT://WATZ/VMKURU,computer";
my $c = Win32::OLE->GetObject($ADsPath) or die "Fehler bei Get $ADsPath\n";

# Benutzerkonto-Objekt erzeugen.
my $u = $c->Create("user", $username);
$u->SetInfo(); # Benutzerkonto muß existieren, bevor es verändert werden kann.

# Vollen Namen eintragen.
$u->{FullName} = $fullname;
$u->SetInfo();
esskar
 2004-02-11 02:50
#35975 #35975
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
"Real Men don't click" habem ein ActiveDirectory.pm geschrieben: wo? hier!
Stonie
 2005-02-21 15:47
#35976 #35976
User since
2005-02-21
3 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich habe da mal ein Problem.

Ziel ist es, das Passwort eines User auf einen Wert zu setzen und ihn beim nächsten Logon zur Passwortänderung aufzufordern.

Die Passwortänderung funktioniert auf diese Weise:
Code: (dl )
1
2
3
$c = Win32::OLE->GetObjekt("WinNT://domaene/user");
$c->SetPassword("neuespasswort");
$c->SetInfo;


Ob der Account gesperrt ist, lässt sich auch auslesen und mittels:
Code: (dl )
$c->{IsAccountLocked} = 0;

wieder freigeben.

Nur bekomm ich es nicht hin, das der User das Passwort bei der nächsten Anmeldung ändern soll.

Laut der ADSI-Hilfe von Microsoft sollte es mit:
Code: (dl )
$c->Put{pwdLastSet, 0}; $c->SetInfo;


gehen. Tut aber nicht.
Was mir aufgefallen ist, wenn ich ein
print $c->{pwdLastSet}
ausgeben lasse, bekomm ich den Fehler:
die Verzeichniseigenschaft wurde nicht im Cache gefunden.
Merkwürdig ist auch, das laut der ADSI-Hilfe der Profilpfad der User mit
$c->{ProfilePath} ausgegeben werden soll, bei mir dort aber der selbe Fehler (Verzeichniseigenschaft wurde nicht im Cache gefunden) ausgegeben wird.
Den Profilpfad bekomme ich aber mit
$c->{profile}

Meine Vermutung ist jetzt natürlich,  das die Eigenschaft nicht "pwdLastSet" ist, nur habe ich keine Ahnung wie ich den richtigen Namen herausfinde und woran liegt es, das die Eigenschaften bei mir von denen in der Hilfe abweichen?
Hat jemand ne Idee, wie ich weiter vorgehen kann?

edit renee: ne Runde [code]- und [tt]-Tags spendiert...\n\n

<!--EDIT|renee|1108995032-->
esskar
 2005-02-21 16:05
#35977 #35977
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Hallo Stonie,

[quote=esskar,11.02.2004, 01:50]"Real Men don't click" habem ein ActiveDirectory.pm geschrieben: wo? hier![/quote]

lad dir das Modul mal runter (ist nur eine datei: http://isg.ee.ethz.ch/tools/realmen/down/data/Win32/ActiveDirectory.pm ) oder versuch es mal mit

Code: (dl )
$c->put {PasswordRequired => 1}
Stonie
 2005-02-21 17:12
#35978 #35978
User since
2005-02-21
3 Artikel
BenutzerIn
[default_avatar]
Hi esskar,

Dein Vorschlag war es zwar nicht ganz, aber Du hast mich auf die richtige Fährte gebracht.
$c->{PasswordExpired} = 1;
$c->SetInfo;

Damit funktioniert es :)
Danke vielmals.
Strat
 2005-02-21 18:18
#35979 #35979
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
nebenbei: diese ganzen infos werden alle im Attribut userAccountControl vorgehalten... das koennte man auch direkt setzen, und spart sich so die ganzen Umwege ueber die Objektattribute...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Stonie
 2005-02-22 22:28
#35980 #35980
User since
2005-02-21
3 Artikel
BenutzerIn
[default_avatar]
Hallo Strat,

zwar verstehe ich nicht was Du mit Attribut userAccountControl meinst, aber ich bin hochinteressiert.

Wie kann man sich die Umwege sparen? Vielleicht ein kleines Beispiel?
Strat
 2005-02-23 20:48
#35981 #35981
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
schau dir vielleicht mal mit einem ldap-browser das attribut userAccountControl eines Users an... darin steht numerisch codiert, welchen zustand der account hat; ich habe jetzt die Zahlen nicht (und auch kein AD) hier und kann dir die genauen Werte nicht sagen, aber ich glaube, 512 oder 312 deaktiviert den account. Die unterschiedlichen Werte kannst du einfach ermitteln, indem du um Windows-Benutzermanager die Grundeinstellungen veraenderst (es sind die um account aktiviert/deaktiviert), und mit einem LDAP-Browser nachschaust und dir die werte merkst.

Nebenbei: wenn du z.B. ein AD global durchsuchen koennen willst, dann hilft dir der globale Katalog weiter. der laeuft meistens auf einem der haupt-domaincontroller (kann man aber veraendern), und dorthinein werden alle benutzerobjekte reinsynchronisiert, allerdings nur mit einigen attributen (welche dies sind, kann man ueber die Management-Konsole des AD-Schemas einstellen... standardmaessig erreicht man die, wenn man zunaechst die schmmgt.dll (oder so aehnlich, liegt in system32) mit regsvr32.exe (oder regsrv32.exe) schmmgt.dll registriert, und dann gibt es fuer die managementkonsole ein weiteres snapin, das man hinzufuegen kann, mit dem man das schema bearbeiten kann, schemaerweiterungen durchfuehren, oder auch attribute zum globalen katalog hinzufuegen oder entfernen kann. es macht jedoch in groesseren netzwerken oft wenig sinn, alle attribute der objektklasse user zum globalen katalog hinzuzufuegen, weil sich sonst die ADs zu tode synchronisieren...

Normal: ldap://server/cn=myuser,dc=domain,dc=org
Globaler Katalog: GC://server/cn=myuser,dc=domain,dc=org (bei firewalls aufpassen, weil GC einen anderen port als LDAP verwendet, naemlich irgendeinen in der gegend von 3200...)\n\n

<!--EDIT|Strat|1109184906-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 9 Einträge, 1 Seite



View all threads created 2004-02-10 12:34.