$zone) { switch ($zone['DSPROPERTY_ZONE_TYPE'][0]) { case 'DNS_ZONE_TYPE_FORWARDER': $condfwd[$name] = $zone['DSPROPERTY_ZONE_MASTER_SERVERS_DA'][0]; $forwarders = ''; foreach ($zone['DSPROPERTY_ZONE_MASTER_SERVERS_DA'][0] as $forwarder) { switch ($forwarder['AddressFamily']) { case 'AF_INET': $forwarders .= $forwarder['IPv4Address'] . '; '; break; case 'AF_INET6': $forwarders .= $forwarder['IPv6Address'] . '; '; break; } } echo 'zone "' . $name . '" { type forward; forward first; forwarders { ' . $forwarders . '}; };' . "\n\n"; break; case 'DNS_ZONE_TYPE_PRIMARY': if ($name == '..TrustAnchors') continue; //if (strpos($name,'_msdcs.') === 0) // continue; $servers = implode('; ', gethostbynamel($adserver)) . ';'; echo 'zone "' . $name . '" { type slave; file "slave_' . $name . '"; masters { ' . $servers . ' }; allow-notify { ' . $servers . ' }; };' . "\n\n"; break; } } //print_r($condfwd); ldap_close($conn); exit (0); ############################################################ # http://download.microsoft.com/download/9/5/E/95EF66AF-9026-4BB0-A41D-A4F81802D92C/%5BMS-DNSP%5D.pdf function read8(&$bytes) { if (count($bytes) < 1) print("Length mismatch"); return array_shift($bytes); } function read16(&$bytes, $bigEndian = FALSE) { if (count($bytes) < 2) print("Length mismatch"); if ($bigEndian == TRUE) return array_shift($bytes) + array_shift($bytes) *pow(2,8); else return array_shift($bytes) *pow(2,8) + array_shift($bytes); } function read32(&$bytes, $bigEndian = FALSE) { if (count($bytes) < 4) print("Length mismatch"); if ($bigEndian == TRUE) return array_shift($bytes) + array_shift($bytes) *pow(2,8) + array_shift($bytes) *pow(2,16) + array_shift($bytes) *pow(2,24); else return array_shift($bytes) *pow(2,24) + array_shift($bytes) *pow(2,16) + array_shift($bytes) *pow(2,8) + array_shift($bytes); } function read64(&$bytes, $bigEndian = FALSE) { if (count($bytes) < 8) print("Length mismatch"); if ($bigEndian == TRUE) return array_shift($bytes) + array_shift($bytes) *pow(2,8) + array_shift($bytes) *pow(2,16) + array_shift($bytes) *pow(2,24) + array_shift($bytes) *pow(2,32) + array_shift($bytes) *pow(2,40) + array_shift($bytes) *pow(2,48) + array_shift($bytes) *pow(2,56); else return array_shift($bytes) *pow(2,56) + array_shift($bytes) *pow(2,48) + array_shift($bytes) *pow(2,40) + array_shift($bytes) *pow(2,32) + array_shift($bytes) *pow(2,24) + array_shift($bytes) *pow(2,16) + array_shift($bytes) *pow(2,8) + array_shift($bytes); } function read_dnsProperty($data) { $results = array(); $ids[0x0000001] = 'DSPROPERTY_ZONE_TYPE'; $ids[0x0000002] = 'DSPROPERTY_ZONE_ALLOW_UPDATE'; $ids[0x0000008] = 'DSPROPERTY_ZONE_SECURE_TIME'; $ids[0x0000010] = 'DSPROPERTY_ZONE_NOREFRESH_INTERVAL'; $ids[0x0000020] = 'DSPROPERTY_ZONE_REFRESH_INTERVAL'; $ids[0x0000040] = 'DSPROPERTY_ZONE_AGING_STATE'; $ids[0x0000011] = 'DSPROPERTY_ZONE_SCAVENGING_SERVERS'; $ids[0x0000012] = 'DSPROPERTY_ZONE_AGING_ENABLED_TIME'; $ids[0x0000080] = 'DSPROPERTY_ZONE_DELETED_FROM_HOSTNAME'; $ids[0x0000081] = 'DSPROPERTY_ZONE_MASTER_SERVERS'; $ids[0x0000082] = 'DSPROPERTY_ZONE_AUTO_NS_SERVERS'; $ids[0x0000083] = 'DSPROPERTY_ZONE_DCPROMO_CONVERT'; $ids[0x0000090] = 'DSPROPERTY_ZONE_SCAVENGING_SERVERS_DA'; $ids[0x0000091] = 'DSPROPERTY_ZONE_MASTER_SERVERS_DA'; $ids[0x0000092] = 'DSPROPERTY_ZONE_AUTO_NS_SERVERS_DA'; $ids[0x0000100] = 'DSPROPERTY_ZONE_NODE_DBFLAGS'; foreach ($data as $item) { $item = str_split($item); foreach ($item as &$char) $char = ord($char); unset($char); //print_r($item); $DataLength = read32($item, TRUE); $NameLength = read32($item, TRUE); $Flag = read32($item, TRUE); $Version = read32($item, TRUE); $Id = read32($item, TRUE); $Data = array(); for ($i=0; $i<$DataLength; $i++) $Data[] = $item[$i]; $Name = read32($item, TRUE); //echo $ids[$Id] . "\n"; //print_r($Data); switch ($ids[$Id]) { case 'DSPROPERTY_ZONE_TYPE': $result = read_ZONE_TYPE($Data); break; case 'DSPROPERTY_ZONE_ALLOW_UPDATE': $result = read_ZONE_UPDATE($Data); break; case 'DSPROPERTY_ZONE_SECURE_TIME': $result = read_timestamp64($Data); break; case 'DSPROPERTY_ZONE_NOREFRESH_INTERVAL': case 'DSPROPERTY_ZONE_REFRESH_INTERVAL': case 'DSPROPERTY_ZONE_AGING_ENABLED_TIME': $result = read32($Data, TRUE); break; case 'DSPROPERTY_ZONE_AGING_STATE': $result = read_bool($Data); break; case 'DSPROPERTY_ZONE_SCAVENGING_SERVERS': case 'DSPROPERTY_ZONE_MASTER_SERVERS': case 'DSPROPERTY_ZONE_AUTO_NS_SERVERS': $result = read_IP4_ARRAY($Data); break; case 'DSPROPERTY_ZONE_DCPROMO_CONVERT': $result = read_DCPROMO_CONVERT($Data); break; case 'DSPROPERTY_ZONE_SCAVENGING_SERVERS_DA': case 'DSPROPERTY_ZONE_MASTER_SERVERS_DA': case 'DSPROPERTY_ZONE_AUTO_NS_SERVERS_DA': $result = read_DNS_ADDR_ARRAY($Data); break; case 'DSPROPERTY_ZONE_NODE_DBFLAGS': $result = read_DCPROMO_CONVERT($Data); break; case 'DSPROPERTY_ZONE_DELETED_FROM_HOSTNAME': $result = read_UnicodeString($Data); break; default: $result = ''; foreach ($item as $char) $result .= chr($char); } $results[$ids[$Id]][] = $result; } return $results; } function read_IP4_ARRAY($data) { // TODO: untested if (count($data) == 0) return NULL; $AddrCount = read32($data, TRUE); if ($AddrCount == 0) return NULL; $results = array(); for ($i = 0; $i < $AddrCount; $i++) { $results[] = long2ip(read32($data)); } } function read_DNS_ADDR($data) { $AddressFamily = read16($data, TRUE); switch ($AddressFamily) { case 0x0002: $AddressFamily = 'AF_INET'; break; case 0x0017: $AddressFamily = 'AF_INET6'; break; } $PortNumber = read16($data); $IPv4Address = long2ip(read32($data)); if ($IPv4Address == '0.0.0.0') $IPv4Address = NULL; $IPv6Address = ''; for ($i=0; $i<8; $i++) { $IPv6Address .= dechex(read16($data)) . ':'; } $IPv6Address = substr($IPv6Address, 0, strlen($IPv6Address)-1); if ($IPv6Address == '0:0:0:0:0:0:0:0') $IPv6Address = NULL; read64($data); // Padding $SockaddrLength = read32($data); $SubnetLength = read32($data); $Flags = read32($data); read64($data); read64($data); read32($data); // Padding return array( "AddressFamily" => $AddressFamily, "PortNumber" => $PortNumber, "IPv4Address" => $IPv4Address, "IPv6Address" => $IPv6Address, ); } function read_DNS_ADDR_ARRAY($data) { if (count($data) == 0) return NULL; $MaxCount = read32($data, TRUE); $AddrCount = read32($data, TRUE); if ($MaxCount != $AddrCount) die("Error: MacCount != AddrCount"); if ($MaxCount == 0) return NULL; $Tag = read32($data, TRUE); $Family = read16($data, TRUE); $WordReserved = read16($data, TRUE); $Flags = read32($data, TRUE); $MatchFlag = read32($data, TRUE); $Reserved1 = read32($data, TRUE); $Reserved2 = read32($data, TRUE); $results = array(); for ($i = 0; $i < $MaxCount; $i++) { $results[] = read_DNS_ADDR(array_splice($data, 0, 64)); } return $results; } function read_UnicodeString($data) { // TODO: untested for ($i = 0; $i < count($data); $i++) { $char = read8($data); if ($char == 0) return; $string .= ord($char); } } function read_DCPROMO_CONVERT($data) { $val = read32($data, TRUE); // TODO: untested; unsure whether this is big-endian switch ($val) { case '0x00000000': return 'DCPROMO_CONVERT_NONE'; break; case '0x00000001': return 'DCPROMO_CONVERT_DOMAIN'; break; case '0x00000002': return 'DCPROMO_CONVERT_FOREST'; break; } } function read_bool($data) { if (count($data) == 4) $val = read32($data); if (count($data) == 2) $val = read16($data); if (count($data) == 1) $val = read8($data); if (count($data) == 8) $val = read64($data); if ($val == 0) return FALSE; else return TRUE; } function read_timestamp64($data) { $val = read64($data, TRUE); $unix_time = round($val) - 11644473600; date_default_timezone_set('UTC'); return date("r", $unix_time); } function read_ZONE_UPDATE($data) { if (count($data) == 1) $val = read8($data); switch ($val) { case '0x00000000': return 'ZONE_UPDATE_OFF'; break; case '0x00000001': return 'ZONE_UPDATE_UNSECURE'; break; case '0x00000002': return 'ZONE_UPDATE_SECURE'; break; } } function read_ZONE_TYPE($data) { $val = read32($data, TRUE); switch ($val) { case 0x00: return 'DNS_ZONE_TYPE_CACHE'; break; case 0x01: return 'DNS_ZONE_TYPE_PRIMARY'; break; case 0x02: return 'DNS_ZONE_TYPE_SECONDARY'; break; case 0x03: return 'DNS_ZONE_TYPE_STUB'; break; case 0x04: return 'DNS_ZONE_TYPE_FORWARDER'; break; case 0x05: return 'DNS_ZONE_TYPE_SECONDARY_CACHE'; break; } } ?>