⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smbldap_tools.pm

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 PM
📖 第 1 页 / 共 2 页
字号:
# success = add_samba_machine_smbpasswd($computername)sub add_samba_machine_smbpasswd  {    my $user = shift;    system "smbpasswd -a -m $user";    return 1;  }sub add_samba_machine  {	my ($user, $uid) = @_;	my $sambaSID = 2 * $uid + 1000;	my $name = $user;	$name =~ s/.$//s;	my ($lmpassword,$ntpassword) = ntlmgen $name;		my $modify = $ldap->modify ( "uid=$user,$config{computersdn}",										changes => [													replace => [objectClass => ['inetOrgPerson', 'posixAccount', 'sambaSAMAccount']],													add => [sambaPwdLastSet => '0'],													add => [sambaLogonTime => '0'],													add => [sambaLogoffTime => '2147483647'],													add => [sambaKickoffTime => '2147483647'],													add => [sambaPwdCanChange => '0'],													add => [sambaPwdMustChange => '0'],													add => [sambaAcctFlags => '[W          ]'],													add => [sambaLMPassword => "$lmpassword"],													add => [sambaNTPassword => "$ntpassword"],													add => [sambaSID => "$config{SID}-$sambaSID"],													add => [sambaPrimaryGroupSID => "$config{SID}-0"]												   ]									  );		$modify->code && die "failed to add entry: ", $modify->error ;	return 1;  }sub group_add_user  {	my ($group, $userid) = @_;	my $members='';	my $dn_line = get_group_dn($group);	if (!defined(get_group_dn($group))) {	  print "$0: group \"$group\" doesn't exist\n";	  exit (6); 	}	if (!defined($dn_line)) {	  return 1;	}	my $dn = get_dn_from_line("$dn_line");	# on look if the user is already present in the group	my $is_member=is_group_member($dn,$userid);	if ($is_member == 1) {	  print "User \"$userid\" already member of the group \"$group\".\n";	} else {	  # bind to a directory with dn and password	  # It does not matter if the user already exist, Net::LDAP will add the user	  # if he does not exist, and ignore him if his already in the directory.	  my $modify = $ldap->modify ( "$dn",										  changes => [													  add => [memberUid => $userid]													 ]										);	  $modify->code && die "failed to modify entry: ", $modify->error ;	}  }sub group_del  {	my $group_dn=shift;	# bind to a directory with dn and password	my $modify = $ldap->delete ($group_dn);	$modify->code && die "failed to delete group : ", $modify->error ;  }sub add_grouplist_user  {	my ($grouplist, $user) = @_;	my @array = split(/,/, $grouplist);	foreach my $group (@array) {	  group_add_user($group, $user);	}  }sub disable_user  {	my $user = shift;	my $dn_line;	my $dn = get_dn_from_line($dn_line);		if (!defined($dn_line = get_user_dn($user))) {	  print "$0: user $user doesn't exist\n";	  exit (10);	}	my $modify = $ldap->modify ( "$dn",										changes => [													replace => [userPassword => '{crypt}!x']												   ]									  );	$modify->code && die "failed to modify entry: ", $modify->error ;	if (is_samba_user($user)) {	  my $modify = $ldap->modify ( "$dn",										  changes => [													  replace => [sambaAcctFlags => '[D       ]']													 ]										);	  $modify->code && die "failed to modify entry: ", $modify->error ;	}  }# delete_user($user)sub delete_user  {	my $user = shift;	my $dn_line;	if (!defined($dn_line = get_user_dn($user))) {	  print "$0: user $user doesn't exist\n";	  exit (10);	}	my $dn = get_dn_from_line($dn_line);	my $modify = $ldap->delete($dn);  }# $gid = group_add($groupname, $group_gid, $force_using_existing_gid)sub group_add  {	my ($gname, $gid, $force) = @_;	my $nscd_status = system "/etc/init.d/nscd status >/dev/null 2>&1";	if ($nscd_status == 0) {	  system "/etc/init.d/nscd stop > /dev/null 2>&1";	}	if (!defined($gid)) {	  #while (defined(getgrgid($config{GID_START}))) {	  #	$config{GID_START}++;	  #}	  #$gid = $config{GID_START};	  $gid=get_next_id($config{groupsdn},"gidNumber");	} else {	  if (!defined($force)) {		if (defined(getgrgid($gid))) {		  return undef;		}	  }	}	if ($nscd_status == 0) {	  system "/etc/init.d/nscd start > /dev/null 2>&1";	}	my $modify = $ldap->add ( "cn=$gname,$config{groupsdn}",									 attrs => [											   objectClass => 'posixGroup',											   cn => "$gname",											   gidNumber => "$gid"											  ]								   );		$modify->code && die "failed to add entry: ", $modify->error ;	return $gid;  }# $homedir = get_homedir ($user)sub get_homedir  {	my $user = shift;	my $homeDir='';	my $entry;	my  $mesg = $ldap->search (									 base   =>$config{usersdn},									 scope => $config{scope},									 filter => "(&(objectclass=posixAccount)(uid=$user))"									);	$mesg->code && die $mesg->error;	my $nb=$mesg->count;	if ($nb > 1) {	  print "Aborting: there are $nb existing user named $user\n";	  foreach $entry ($mesg->all_entries) {		my $dn=$entry->dn;		print "  $dn\n";	  }	  exit (4);	} else {	  $entry = $mesg->shift_entry();	  $homeDir= $entry->get_value("homeDirectory");	}	chomp $homeDir;	if ($homeDir eq '') {	  return undef;	}	return $homeDir;  }# search for an usersub read_user  {	my $user = shift;	my $lines ='';	my $mesg = $ldap->search ( # perform a search									base   => $config{suffix},									scope => $config{scope},									filter => "(&(objectclass=posixAccount)(uid=$user))"								   );	$mesg->code && die $mesg->error;	foreach my $entry ($mesg->all_entries) {	  $lines.= "dn: " . $entry->dn."\n";	  foreach my $attr ($entry->attributes) {		{		  $lines.= $attr.": ".join(',', $entry->get_value($attr))."\n";		}	  }	}	chomp $lines;	if ($lines eq '') {	  return undef;	}	return $lines;  }# search for a user# return the attributes in an arraysub read_user_entry  {	my $user = shift;	my  $mesg = $ldap->search ( # perform a search									 base   => $config{suffix},									 scope => $config{scope},									 filter => "(&(objectclass=posixAccount)(uid=$user))"									);	$mesg->code && die $mesg->error;	my $entry = $mesg->entry();	return $entry;  }# search for a groupsub read_group  {	my $user = shift;	my $lines ='';	my  $mesg = $ldap->search ( # perform a search									 base   => $config{groupsdn},									 scope => $config{scope},									 filter => "(&(objectclass=posixGroup)(cn=$user))"									);	$mesg->code && die $mesg->error;	foreach my $entry ($mesg->all_entries) {	  $lines.= "dn: " . $entry->dn."\n";	  foreach my $attr ($entry->attributes) {		{		  $lines.= $attr.": ".join(',', $entry->get_value($attr))."\n";		}	  }	}	chomp $lines;	if ($lines eq '') {	  return undef;	}	return $lines;  }# find groups of a given user##### MODIFIE ########sub find_groups_of {  my $user = shift;  my @groups = ();  my $mesg = $ldap->search ( # perform a search                                  base   => $config{groupsdn},                                  scope => $config{scope},                                  filter => "(&(objectclass=posixGroup)(memberuid=$user))"                                 );  $mesg->code && die $mesg->error;  my $entry;  while ($entry = $mesg->shift_entry()) {    push(@groups, scalar($entry->get_value('cn')));  }  return (@groups);}sub read_group_entry {  my $group = shift;  my $entry;  my %res;  my  $mesg = $ldap->search ( # perform a search								   base   => $config{groupsdn},								   scope => $config{scope},								   filter => "(&(objectclass=posixGroup)(cn=$group))"								  );  $mesg->code && die $mesg->error;  my $nb=$mesg->count;  if ($nb > 1) {    print "Error: $nb groups exist \"cn=$group\"\n";    foreach $entry ($mesg->all_entries) {	  my $dn=$entry->dn; print "  $dn\n";	}    exit 11;  } else {    $entry = $mesg->shift_entry();  }  return $entry;}sub read_group_entry_gid {  my $group = shift;  my %res;  my  $mesg = $ldap->search ( # perform a search								   base   => $config{groupsdn},								   scope => $config{scope},								   filter => "(&(objectclass=posixGroup)(gidNumber=$group))"								  );  $mesg->code && die $mesg->error;  my $entry = $mesg->shift_entry();  return $entry;}# return the gidnumber for a group given as name or gid# -1 : bad group name# -2 : bad gidnumbersub parse_group  {	my $userGidNumber = shift;	if ($userGidNumber =~ /[^\d]/ ) {	  my $gname = $userGidNumber;	  my $gidnum = getgrnam($gname);	  if ($gidnum !~ /\d+/) {		return -1;	  } else {		$userGidNumber = $gidnum;	  }	} elsif (!defined(getgrgid($userGidNumber))) {	  return -2;	}	return $userGidNumber;  }# remove $user from $groupsub group_remove_member  {	my ($group, $user) = @_;	my $members='';	my $grp_line = get_group_dn($group);	if (!defined($grp_line)) {	  return 0;	}	my $dn = get_dn_from_line($grp_line);	# we test if the user exist in the group	my $is_member=is_group_member($dn,$user);	if ($is_member == 1) {	  # delete only the user from the group	  my $modify = $ldap->modify ( "$dn",										  changes => [													  delete => [memberUid => ["$user"]]													 ]										);	  $modify->code && die "failed to delete entry: ", $modify->error ;	}	return 1;  }sub group_get_members  {	my ($group) = @_;	my $members;	my @resultat;	my $grp_line = get_group_dn($group);	if (!defined($grp_line)) {	  return 0;	}	my  $mesg = $ldap->search (							   base   => $config{groupsdn},							   scope => $config{scope},							   filter => "(&(objectclass=posixgroup)(cn=$group))"							  );	$mesg->code && die $mesg->error;	foreach my $entry ($mesg->all_entries) {	  foreach my $attr ($entry->attributes) {		if ($attr=~/\bmemberUid\b/) {		  foreach my $ent ($entry->get_value($attr)) {			push (@resultat,$ent);		  }		}	  }	}	return @resultat;  }sub do_ldapmodify  {	my $ldif = shift;	my $FILE = "|$config{ldapmodify} -r >/dev/null";	open (FILE, $FILE) || die "$!\n";	print FILE <<EOF;$ldifEOF	;	close FILE;	my $rc = $?;	return $rc;  }sub group_type_by_name {  my $type_name = shift;  my %groupmap = (				  'domain' => 2,				  'local' => 4,				  'builtin' => 5				 );  return $groupmap{$type_name};}sub subst_user  {	my ($str, $username) = @_;	$str =~ s/%U/$username/ if ($str);	return($str);  }# all given mails are stored in a table (remove the comma separated)sub split_arg_comma {  my $arg = shift;  my @args;  if (defined($arg)) {    if ($arg eq '-') {      @args = ( );    } else {      @args = split(/\s*,\s*/, $arg);    }  }  return (@args);}sub list_union {  my ($list1, $list2) = @_;  my @res = @$list1;  foreach my $e (@$list2) {    if (! grep($_ eq $e, @$list1)) {      push(@res, $e);    }  }  return @res;}sub list_minus {  my ($list1, $list2) = @_;  my @res = ();  foreach my $e (@$list1) {    if (! grep( $_ eq $e, @$list2 )) {      push(@res, $e);    }  }  return @res;}sub get_next_id($$) {  my $ldap_base_dn = shift;  my $attribute = shift;  my $tries = 0;  my $found=0;  my $next_uid_mesg;  my $nextuid;  if ($ldap_base_dn =~ m/$config{usersdn}/i) {	# when adding a new user, we'll check if the uidNumber available is not	# already used for a computer's account	$ldap_base_dn=$config{suffix}  }  do {	$next_uid_mesg = $ldap->search(										  base => $config{sambaUnixIdPooldn},										  filter => "(objectClass=sambaUnixIdPool)",										  scope => "base"										 );	$next_uid_mesg->code && die "Error looking for next uid";	if ($next_uid_mesg->count != 1) {	  die "Could not find base dn, to get next $attribute";	}	my $entry = $next_uid_mesg->entry(0);            	$nextuid = $entry->get_value($attribute);	my $modify=$ldap->modify( "$config{sambaUnixIdPooldn}",									 changes => [												 replace => [ $attribute => $nextuid + 1 ]												]								   );	$modify->code && die "Error: ", $modify->error;	# let's check if the id found is really free (in ou=Groups or ou=Users)...	my $check_uid_mesg = $ldap->search(											  base => $ldap_base_dn,											  filter => "($attribute=$nextuid)",											 );	$check_uid_mesg->code && die "Cannot confirm $attribute $nextuid is free";	if ($check_uid_mesg->count == 0) {	  $found=1;	  return $nextuid;	}	$tries++;	print "Cannot confirm $attribute $nextuid is free: checking for the next one\n"  } while ($found != 1);  die "Could not allocate $attribute!";}1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -