#! /usr/bin/perl use warnings; use strict; use Win32::OLE; use Win32::OLE::Variant; $Win32::OLE::Warn = 3; my $userDn = "cn=Administrator,cn=Users,dc=my,dc=domain"; my $password = 'password'; my $server = 'server.with.full.domain.name'; # ADSI-Objekt erzeugen und anmelden my $adConn = Win32::OLE->CreateObject('ADODB.Connection'); $adConn->{Provider} = 'ADsDSOObject'; $adConn->Properties->{'User ID' } = $userDn; $adConn->Properties->{'Password'} = $password; $adConn->Open(); # root naming context vom $server ermitteln my $rootDSE = Win32::OLE->GetObject("LDAP://$server/RootDSE"); my $rootNamingContext = $rootDSE->Get('defaultNamingContext'); # dann eventuell was suchen my @wantedAttributes = qw( ADsPath cn objectClass member ); # usw my $searchString = join( ";", "", "(&(objectClass=groupOfNames)(cn=*))", join(",", @wantedAttributes ), 'SubTree', ); my $adoCmd = Win32::OLE->new('ADODB.Command'); $adoCmd->{ActiveConnection} = $adConn; $adoCmd->Properties->{'Page Size'} = 1000; $adoCmd->{'CommandText'} = $searchString; my $searchResult = $adoCmd->Execute($searchString); unless (ref $searchResult) { die "Error: couldn't execute searchString: " . Win32::OLE::LastError; } # unless while( my $object = &GetNextEntry( $searchResult, \@wantedAttributes ) ) { # ADSI-Objekt holen my $object = Win32::OLE->GetObject( $object->{ADsPath} ); # mach was mit dem Objekt } # while $searchResult->Close; # ------------------------------------------------------------ sub GetNextEntry { my( $searchResult, $attributesRef ) = @_; return if $searchResult->EOF; my %object = map { $attributesRef->[$_] => $searchResult->Fields($_)->value } 0..$#attributesRef; $searchResult->MoveNext; return \%object; } # GetNextEntry # ------------------------------------------------------------