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

📄 adssearch.pl

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 PL
📖 第 1 页 / 共 3 页
字号:
#!/usr/bin/perl -w# # adssearch.pl 	- query an Active Directory server and#		  display objects in a human readable format## Copyright (C) Guenther Deschner <gd@samba.org> 2003-2005## TODO: add range retrieval#	write sddl-converter, decode userParameters#	chase referrals#	apparently only win2k3 allows simple-binds with machine-accounts.#	make sasl support independent from Authen::SASL::Cyrus v >0.11use strict;use Net::LDAP;use Net::LDAP::Control;use Convert::ASN1;use Time::Local;use POSIX qw(strftime);use Getopt::Long;my $have_sasl;my $works_sasl;my $pref_version;BEGIN {	my $class = 'Authen::SASL';	$pref_version = "0.32";        if ( eval "require $class;" ) {                $have_sasl = 1;        }        if ( eval "Net::LDAP->VERSION($pref_version);" ) {                $works_sasl = 1;        }}# users may set defaults heremy $base 	= "";my $binddn 	= "";my $password 	= "";my $server 	= "";my $tdbdump	= "/usr/bin/tdbdump";my $testparm	= "/usr/bin/testparm";my $net		= "/usr/bin/net";my $dig		= "/usr/bin/dig";my $nmblookup	= "/usr/bin/nmblookup";my $secrets_tdb = "/etc/samba/secrets.tdb";my $klist	= "/usr/bin/klist";my $kinit	= "/usr/bin/kinit";my $ads_h 	= "/home/gd/ads.h";my $page_size	= "1000";my $workgroup	= "";my $machine	= "";my $realm	= "";# parse inputmy (	$opt_asq,	$opt_base, 	$opt_binddn,	$opt_debug,	$opt_display_extendeddn,	$opt_display_metadata,	$opt_display_raw,	$opt_dump_rootdse,	$opt_dump_schema,	$opt_dump_wknguid,	$opt_help, 	$opt_host, 	$opt_machine,	$opt_notify, 	$opt_notify_nodiffs, 	$opt_password,	$opt_port,	$opt_realm,	$opt_saslmech,	$opt_scope, 	$opt_simpleauth,	$opt_starttls,	$opt_user,	$opt_verbose,	$opt_workgroup,);GetOptions(	'asq=s'		=> \$opt_asq,	'base|b=s'	=> \$opt_base,	'D|DN=s'	=> \$opt_binddn,	'debug=i'	=> \$opt_debug,	'extendeddn|e'	=> \$opt_display_extendeddn,	'help'		=> \$opt_help,	'host|h=s'	=> \$opt_host,	'machine|P'	=> \$opt_machine,	'metadata|m'	=> \$opt_display_metadata,	'nodiffs'	=> \$opt_notify_nodiffs,	'notify|n'	=> \$opt_notify,	'password|w=s'	=> \$opt_password,	'port=i'	=> \$opt_port,	'rawdisplay'	=> \$opt_display_raw,	'realm|R=s'	=> \$opt_realm,	'rootDSE'	=> \$opt_dump_rootdse,	'saslmech|Y=s'	=> \$opt_saslmech,	'schema|c'	=> \$opt_dump_schema,	'scope|s=s'	=> \$opt_scope,	'simpleauth|x'	=> \$opt_simpleauth,	'tls|Z'		=> \$opt_starttls,	'user|U=s'	=> \$opt_user,	'verbose|v'	=> \$opt_verbose,	'wknguid'	=> \$opt_dump_wknguid,	'workgroup|k=s'	=> \$opt_workgroup,	);# activate controlsmy $paging	= 1 if !$opt_notify;if (!@ARGV && !$opt_dump_schema && !$opt_dump_rootdse && !$opt_notify || $opt_help) {	usage();	exit 1;}# get the querymy $query 	= shift;my @attrs	= @ARGV;# some global varsmy ($filter, $dse, $uri);my ($attr, $value);my (@ctrls, @ctrls_s);my ($ctl_paged, $cookie);my ($page_count, $total_entry_count);my ($sasl_hd, $async_ldap_hd, $sync_ldap_hd);my ($mesg, $usn);my (%entry_store);my $async_search;my (%ads_atype, %ads_gtype, %ads_grouptype, %ads_uf);# fixed values and varsmy $set   	= "X";my $unset 	= "-";my $tabsize 	= "\t\t\t";# get defaultsmy $scope 	= $opt_scope 	|| "sub"; my $port 	= $opt_port;my %ads_controls = ("LDAP_SERVER_NOTIFICATION_OID"	 	=> "1.2.840.113556.1.4.528","LDAP_SERVER_EXTENDED_DN_OID" 		=> "1.2.840.113556.1.4.529","LDAP_PAGED_RESULT_OID_STRING"		=> "1.2.840.113556.1.4.319","LDAP_SERVER_SD_FLAGS_OID"		=> "1.2.840.113556.1.4.801","LDAP_SERVER_SORT_OID"			=> "1.2.840.113556.1.4.473","LDAP_SERVER_RESP_SORT_OID"		=> "1.2.840.113556.1.4.474","LDAP_CONTROL_VLVREQUEST"		=> "2.16.840.1.113730.3.4.9","LDAP_CONTROL_VLVRESPONSE"		=> "2.16.840.1.113730.3.4.10","LDAP_SERVER_RANGE_RETRIEVAL"		=> "1.2.840.113556.1.4.802", #unsure"LDAP_SERVER_SHOW_DELETED_OID"		=> "1.2.840.113556.1.4.417","LDAP_SERVER_CROSSDOM_MOVE_TARGET_OID" 	=> "1.2.840.113556.1.4.521","LDAP_SERVER_LAZY_COMMIT_OID"		=> "1.2.840.113556.1.4.619","LDAP_SERVER_TREE_DELETE_OID"		=> "1.2.840.113556.1.4.805","LDAP_SERVER_DIRSYNC_OID"		=> "1.2.840.113556.1.4.841","LDAP_SERVER_VERIFY_NAME_OID"		=> "1.2.840.113556.1.4.1338","LDAP_SERVER_DOMAIN_SCOPE_OID"		=> "1.2.840.113556.1.4.1339","LDAP_SERVER_SEARCH_OPTIONS_OID"	=> "1.2.840.113556.1.4.1340","LDAP_SERVER_PERMISSIVE_MODIFY_OID" 	=> "1.2.840.113556.1.4.1413","LDAP_SERVER_ASQ_OID"			=> "1.2.840.113556.1.4.1504","NONE (Get stats control)"		=> "1.2.840.113556.1.4.970","LDAP_SERVER_QUOTA_CONTROL_OID"		=> "1.2.840.113556.1.4.1852",);my %ads_capabilities = ("LDAP_CAP_ACTIVE_DIRECTORY_OID"		=> "1.2.840.113556.1.4.800","LDAP_CAP_ACTIVE_DIRECTORY_V51_OID" 	=> "1.2.840.113556.1.4.1670","LDAP_CAP_ACTIVE_DIRECTORY_LDAP_INTEG_OID" => "1.2.840.113556.1.4.1791",);my %ads_extensions = ("LDAP_START_TLS_OID"			=> "1.3.6.1.4.1.1466.20037","LDAP_TTL_EXTENDED_OP_OID"		=> "1.3.6.1.4.1.1466.101.119.1","LDAP_SERVER_FAST_BIND_OID"		=> "1.2.840.113556.1.4.1781", "NONE (TTL refresh extended op)" 	=> "1.3.6.1.4.1.1466.101.119.1",);my %ads_matching_rules = ("LDAP_MATCHING_RULE_BIT_AND"		=> "1.2.840.113556.1.4.803","LDAP_MATCHING_RULE_BIT_OR"		=> "1.2.840.113556.1.4.804",);my %wknguids = ("WELL_KNOWN_GUID_COMPUTERS"		=> "AA312825768811D1ADED00C04FD8D5CD","WELL_KNOWN_GUID_DOMAIN_CONTROLLERS"	=> "A361B2FFFFD211D1AA4B00C04FD7D83A","WELL_KNOWN_GUID_SYSTEM"		=> "AB1D30F3768811D1ADED00C04FD8D5CD","WELL_KNOWN_GUID_USERS"			=> "A9D1CA15768811D1ADED00C04FD8D5CD",);my %ads_systemflags = ("FLAG_DONT_REPLICATE"			=> 0x00000001,	# 1"FLAG_REPLICATE_TO_GC"			=> 0x00000002,	# 2"FLAG_ATTRIBUTE_CONSTRUCT"		=> 0x00000004,	# 4"FLAG_CATEGORY_1_OBJECT"		=> 0x00000010,	# 16"FLAG_DELETE_WITHOUT_TOMBSTONE"		=> 0x02000000,	# 33554432"FLAG_DOMAIN_DISALLOW_MOVE"		=> 0x04000000,	# 67108864"FLAG_DOMAIN_DISALLOW_RENAME"		=> 0x08000000,	# 134217728#"FLAG_CONFIG_CAN_MOVE_RESTRICTED"	=> 0x10000000,	# 268435456	# only setable on creation#"FLAG_CONFIG_CAN_MOVE"			=> 0x20000000,	# 536870912	# only setable on creation#"FLAG_CONFIG_CAN_RENAME"		=> 0x40000000,	# 1073741824	# only setable on creation"FLAG_DISALLOW_DELETE"			=> 0x80000000,	# 2147483648);my %ads_mixed_domain = ("NATIVE_LEVEL_DOMAIN"			=> 0,"MIXED_LEVEL_DOMAIN"			=> 1,);my %ads_ds_func = ("DS_BEHAVIOR_WIN2000"			=> 0,	# untested"DS_BEHAVIOR_WIN2003"			=> 2,);my %ads_instance_type = ("DS_INSTANCETYPE_IS_NC_HEAD"		=> 0x1,"IT_WRITE"				=> 0x4,"IT_NC_ABOVE"				=> 0x8,);my %ads_uacc = (	"ACCOUNT_NEVER_EXPIRES"		=> 0x000000, # 0 	"ACCOUNT_OK"			=> 0x800000, # 8388608	"ACCOUNT_LOCKED_OUT"		=> 0x800010, # 8388624);my %ads_gpoptions = (	"GPOPTIONS_INHERIT"		=> 0,	"GPOPTIONS_BLOCK_INHERITANCE"	=> 1,);my %ads_gplink_opts = (	"GPLINK_OPT_NONE"		=> 0,	"GPLINK_OPT_DISABLED"		=> 1,	"GPLINK_OPT_ENFORCED"		=> 2,);my %ads_gpflags = (	"GPFLAGS_ALL_ENABLED"			=> 0,	"GPFLAGS_USER_SETTINGS_DISABLED"	=> 1,	"GPFLAGS_MACHINE_SETTINGS_DISABLED"	=> 2,	"GPFLAGS_ALL_DISABLED"			=> 3,);my %ads_serverstate = (	"SERVER_ENABLED"		=> 1,	"SERVER_DISABLED"		=> 2,);my %ads_sdeffective = (	"OWNER_SECURITY_INFORMATION"	=> 0x01,	"DACL_SECURITY_INFORMATION"	=> 0x04,	"SACL_SECURITY_INFORMATION"	=> 0x10,);my %ads_trustattrs = (	"TRUST_ATTRIBUTE_NON_TRANSITIVE"	=> 1,	"TRUST_ATTRIBUTE_TREE_PARENT"		=> 2,	"TRUST_ATTRIBUTE_TREE_ROOT"		=> 3,	"TRUST_ATTRIBUTE_UPLEVEL_ONLY"		=> 4,);my %ads_trustdirection = (	"TRUST_DIRECTION_INBOUND"		=> 1,	"TRUST_DIRECTION_OUTBOUND"		=> 2,	"TRUST_DIRECTION_BIDIRECTIONAL"		=> 3,);my %ads_trusttype = (	"TRUST_TYPE_DOWNLEVEL"			=> 1,	"TRUST_TYPE_UPLEVEL"			=> 2,	"TRUST_TYPE_KERBEROS"			=> 3,	"TRUST_TYPE_DCE"			=> 4,);my %ads_pwdproperties = (	"DOMAIN_PASSWORD_COMPLEX"		=> 1, 	"DOMAIN_PASSWORD_NO_ANON_CHANGE" 	=> 2, 	"DOMAIN_PASSWORD_NO_CLEAR_CHANGE"	=> 4, 	"DOMAIN_LOCKOUT_ADMINS"			=> 8, 	"DOMAIN_PASSWORD_STORE_CLEARTEXT"	=> 16, 	"DOMAIN_REFUSE_PASSWORD_CHANGE"		=> 32,);my %ads_uascompat = (	"LANMAN_USER_ACCOUNT_SYSTEM_NOLIMITS"	=> 0,	"LANMAN_USER_ACCOUNT_SYSTEM_COMPAT"	=> 1,);my %ads_frstypes = (	"REPLICA_SET_SYSVOL"		=> 2,	# unsure	"REPLICA_SET_DFS"		=> 1,	# unsure	"REPLICA_SET_OTHER"		=> 0,	# unsure);my %ads_gp_cse_extensions = ("Administrative Templates Extension"	=> "35378EAC-683F-11D2-A89A-00C04FBBCFA2","Disk Quotas"				=> "3610EDA5-77EF-11D2-8DC5-00C04FA31A66","EFS Recovery"				=> "B1BE8D72-6EAC-11D2-A4EA-00C04F79F83A","Folder Redirection"			=> "25537BA6-77A8-11D2-9B6C-0000F8080861","IP Security"				=> "E437BC1C-AA7D-11D2-A382-00C04F991E27","Internet Explorer Maintenance"		=> "A2E30F80-D7DE-11d2-BBDE-00C04F86AE3B","QoS Packet Scheduler"			=> "426031c0-0b47-4852-b0ca-ac3d37bfcb39","Scripts"				=> "42B5FAAE-6536-11D2-AE5A-0000F87571E3","Security"				=> "827D319E-6EAC-11D2-A4EA-00C04F79F83A","Software Installation"			=> "C6DC5466-785A-11D2-84D0-00C04FB169F7",);# guess workmy %ads_gpcextensions = ("Administrative Templates"		=> "0F6B957D-509E-11D1-A7CC-0000F87571E3","Certificates"				=> "53D6AB1D-2488-11D1-A28C-00C04FB94F17","EFS recovery policy processing"	=> "B1BE8D72-6EAC-11D2-A4EA-00C04F79F83A","Folder Redirection policy processing"	=> "25537BA6-77A8-11D2-9B6C-0000F8080861","Folder Redirection"			=> "88E729D6-BDC1-11D1-BD2A-00C04FB9603F","Registry policy processing"		=> "35378EAC-683F-11D2-A89A-00C04FBBCFA2","Remote Installation Services"		=> "3060E8CE-7020-11D2-842D-00C04FA372D4","Security Settings"			=> "803E14A0-B4FB-11D0-A0D0-00A0C90F574B","Security policy processing"		=> "827D319E-6EAC-11D2-A4EA-00C04F79F83A","unknown"				=> "3060E8D0-7020-11D2-842D-00C04FA372D4","unknown2"				=> "53D6AB1B-2488-11D1-A28C-00C04FB94F17",);my %ads_gpo_default_guids = ("Default Domain Policy"			=> "31B2F340-016D-11D2-945F-00C04FB984F9","Default Domain Controllers Policy"	=> "6AC1786C-016F-11D2-945F-00C04fB984F9","mist"					=> "61718096-3D3F-4398-8318-203A48976F9E",);my %munged_dial = (	"CtxCfgPresent"		=> \&dump_int,	"CtxCfgFlags1"		=> \&dump_int,	"CtxCallback"		=> \&dump_string,	"CtxShadow"		=> \&dump_string,	"CtxMaxConnectionTime"	=> \&dump_int,	"CtxMaxDisconnectionTime"=> \&dump_int,	"CtxMaxIdleTime"	=> \&dump_int,	"CtxKeyboardLayout"	=> \&dump_int,	"CtxMinEncryptionLevel"	=> \&dump_int,	"CtxWorkDirectory"	=> \&dump_string,	"CtxNWLogonServer"	=> \&dump_string,	"CtxWFHomeDir"		=> \&dump_string,	"CtxWFHomeDirDrive"	=> \&dump_string,	"CtxWFProfilePath"	=> \&dump_string,	"CtxInitialProgram"	=> \&dump_string,	"CtxCallbackNumber"	=> \&dump_string,);$SIG{__WARN__} = sub {	use Carp;	Carp::cluck (shift);};# parse ads.hparse_ads_h();# if there is data missing, we try to autodetect with samba-tools (if installed)# this might fill up workgroup, machine, realmget_samba_info();# get a workgroup$workgroup	= $workgroup || $opt_workgroup || "";# get the server$server 	= process_servername($opt_host) || 		  detect_server($workgroup,$opt_realm) || 		  die "please define server to query with -h host\n";# get the base$base 		= $opt_base || 	 	  get_base_from_rootdse($server,$dse);# get the realm$realm		= $opt_realm || 		  get_realm_from_rootdse($server,$dse);# get sasl mechsmy @sasl_mechs	= get_sasl_mechs_from_rootdse($server,$dse);my $sasl_mech	= "GSSAPI";if ($opt_saslmech) {	$sasl_mech = sprintf("%s", (check_sasl_mech($opt_saslmech) == 0)?uc($opt_saslmech):"");}# set bind typemy $sasl_bind = 1 if (!$opt_simpleauth);# get usernamemy $user 	= check_user($opt_user) || $ENV{'USER'} || "";# gen upnmy $upn		= sprintf("%s", gen_upn($opt_machine ? "$machine\$" : $user, $realm));# get binddn$binddn		= $opt_binddn || $upn;# get the password$password 	= $password || $opt_password;if (!$password) {	$password = $opt_machine ? get_machine_password($workgroup) : get_password();}my %attr_handler = (	"Token-Groups-No-GC-Acceptable" => \&dump_sid,	#wrong name	"accountExpires"		=> \&dump_nttime,	"badPasswordTime"		=> \&dump_nttime,				"creationTime"			=> \&dump_nttime,	"currentTime"			=> \&dump_timestr,	"domainControllerFunctionality" => \&dump_ds_func,	"domainFunctionality" 		=> \&dump_ds_func,	"fRSReplicaSetGUID"		=> \&dump_guid,	"fRSReplicaSetType"		=> \&dump_frstype,	"fRSVersionGUID"		=> \&dump_guid,	"flags"				=> \&dump_gpflags,	# fixme: possibly only on gpos!	"forceLogoff"			=> \&dump_nttime_abs,	"forestFunctionality" 		=> \&dump_ds_func,#	"gPCMachineExtensionNames"	=> \&dump_gpcextensions,#	"gPCUserExtensionNames"		=> \&dump_gpcextensions,	"gPLink"			=> \&dump_gplink,	"gPOptions"			=> \&dump_gpoptions,	"groupType"			=> \&dump_gtype,	"instanceType"			=> \&dump_instance_type,	"lastLogon"			=> \&dump_nttime,	"lastLogonTimestamp"		=> \&dump_nttime,	"lockOutObservationWindow"	=> \&dump_nttime_abs,	"lockoutDuration"		=> \&dump_nttime_abs,	"lockoutTime"			=> \&dump_nttime,#	"logonHours"			=> \&dump_logonhours,	"maxPwdAge"			=> \&dump_nttime_abs,	"minPwdAge"			=> \&dump_nttime_abs,	"modifyTimeStamp"		=> \&dump_timestr,	"msDS-Behavior-Version"		=> \&dump_ds_func,	#unsure	"msDS-User-Account-Control-Computed" => \&dump_uacc,#	"msRADIUSFramedIPAddress"	=> \&dump_ipaddr,#	"msRASSavedFramedIPAddress" 	=> \&dump_ipaddr,	"nTMixedDomain"			=> \&dump_mixed_domain,	"nTSecurityDescriptor"		=> \&dump_secdesc,	"objectGUID"			=> \&dump_guid,	"objectSid"			=> \&dump_sid,	"pKT"				=> \&dump_pkt,	"pKTGuid"			=> \&dump_guid,	"pwdLastSet"			=> \&dump_nttime,	"pwdProperties"			=> \&dump_pwdproperties,	"sAMAccountType"		=> \&dump_atype,	"sDRightsEffective"		=> \&dump_sdeffective,	"securityIdentifier"		=> \&dump_sid,	"serverState"			=> \&dump_serverstate,	"supportedCapabilities",	=> \&dump_capabilities,	"supportedControl",		=> \&dump_controls,	"supportedExtension",		=> \&dump_extension,	"systemFlags"			=> \&dump_systemflags,	"tokenGroups",			=> \&dump_sid,	"tokenGroupsGlobalAndUniversal" => \&dump_sid,	"trustAttributes"		=> \&dump_trustattr,	"trustDirection"		=> \&dump_trustdirection,	"trustType"			=> \&dump_trusttype,	"uASCompat"			=> \&dump_uascompat,	"userAccountControl"		=> \&dump_uac,	"userCertificate"		=> \&dump_cert,	"userFlags"			=> \&dump_uf,	"userParameters"		=> \&dump_munged_dial,	"whenChanged"			=> \&dump_timestr,	"whenCreated"			=> \&dump_timestr,#	"dSCorePropagationData"		=> \&dump_timestr,);################# subfunctions #################sub usage {	print "usage: $0 [--asq] [--base|-b base] [--debug level] [--debug level] [--DN|-D binddn] [--extendeddn|-e] [--help] [--host|-h host] [--machine|-P] [--metadata|-m] [--nodiffs] [--notify|-n] [--password|-w password] [--port port] [--rawdisplay] [--realm|-R realm] [--rootdse] [--saslmech|-Y saslmech] [--schema|-c] [--scope|-s scope] [--simpleauth|-x] [--starttls|-Z] [--user|-U user] [--wknguid] [--workgroup|-k workgroup] filter [attrs]\n";	print "\t--asq [attribute]\n\t\tAttribute to use for a attribute scoped query (LDAP_SERVER_ASQ_OID)\n";	print "\t--base|-b [base]\n\t\tUse base [base]\n";	print "\t--debug [level]\n\t\tUse debuglevel (for Net::LDAP)\n";	print "\t--DN|-D [binddn]\n\t\tUse binddn or principal\n";	print "\t--extendeddn|-e\n\t\tDisplay extended dn (LDAP_SERVER_EXTENDED_DN_OID)\n";	print "\t--help\n\t\tDisplay help page\n";	print "\t--host|-h [host]\n\t\tQuery Host [host] (either a hostname or an LDAP uri)\n";	print "\t--machine|-P\n\t\tUse samba3 machine account stored in $secrets_tdb (needs root access)\n";	print "\t--metdata|-m\n\t\tDisplay replication metadata\n";	print "\t--nodiffs\n\t\tDisplay no diffs but full entry dump when running in notify mode\n";	print "\t--notify|-n\n\t\tActivate asynchronous change notification (LDAP_SERVER_NOTIFICATION_OID)\n";	print "\t--password|-w [password]\n\t\tUse [password] for binddn\n";	print "\t--port [port]\n\t\tUse [port] when connecting ADS\n";	print "\t--rawdisplay\n\t\tDo not interpret values\n";	print "\t--realm|-R [realm]\n\t\tUse [realm] when trying to construct bind-principal\n";	print "\t--rootdse\n\t\tDisplay RootDSE (anonymously)\n";	print "\t--saslmech|-Y [saslmech]\n\t\tUse SASL Mechanism [saslmech] when binding\n";	print "\t--schema|-c\n\t\tDisplay DSE-Schema\n";	print "\t--scope|-s [scope]\n\t\tUse scope [scope] (sub, base, one)\n";	print "\t--simpleauth|-x\n\t\tUse simple bind (otherwise SASL binds are performed)\n";	print "\t--starttls|-Z\n\t\tUse Start TLS extended operation to secure LDAP traffic\n";	print "\t--user|-U [user]\n\t\tUse [user]\n";	print "\t--wknguid\n\t\tDisplay well known guids\n";	print "\t--workgroup|-k [workgroup]\n\t\tWhen LDAP-Server is not known try to find a Domain-Controller for [workgroup]\n";}sub write_ads_list {	my ($mod,$attr,$value) = @_;	my $ofh = select(STDOUT);	$~ = "ADS_LIST";	select($ofh);	write();format ADS_LIST =@<<<< @>>>>>>>>>>>>>>>>>>>>>>>: @*$mod, $attr, $value.}sub write_ads {	my ($mod,$attr,$value) = @_;	my $ofh = select(STDOUT);	$~ = "ADS";	select($ofh);	write();format ADS =@<<<< @>>>>>>>>>>>>>>>>>>>>>>>: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<$mod, $attr, $value~~				^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<				$value.}sub detect_server {	my $workgroup = shift;	my $realm = shift;	my $result;	my $found;	# try net cache (nbt records)	if ( -x $net && $workgroup ) {		my $key = sprintf("NBT/%s#1C", uc($workgroup));		chomp($result = `$net cache search $key 2>&1 /dev/null`);		$result =~ s/^.*Value: //;		$result =~ s/:.*//;		return $result if $result;		printf("%10s query failed for [%s]\n", "net cache", $key);	}	# try dns SRV entries	if ( -x $dig && $realm ) {		my $key = sprintf("_ldap._tcp.%s", lc($realm));		chomp($result = `$dig $key SRV +short +search | egrep "^[0-9]" | head -1`);		$result =~ s/.* //g;		$result =~ s/.$//g;		return $result if $result;		printf("%10s query failed for [%s]\n", "dns", $key);	}	# try netbios broadcast query	if ( -x $nmblookup && $workgroup ) {		my $key = sprintf("%s#1C", uc($workgroup));		my $pattern = sprintf("%s<1c>", uc($workgroup));		chomp($result = `$nmblookup $key -d 0 | grep '$pattern'`);		$result =~ s/\s.*//;		return $result if $result;		printf("%10s query failed for [%s]\n", "nmblookup", $key);	}

⌨️ 快捷键说明

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