use Win32::OLE;
use Win32::OLE::Enum;

@servers= @ARGV;

@web_services = ("w3svc","msftpsvc");

%server_states = ( '1' => 'Starting',
                   '2' => 'Started',
                   '3' => 'Stopping',
                   '4' => 'Stopped',
                   '5' => 'Pausing',
                   '6' => 'Paused',
                   '7' => 'Continuing'
                 );


foreach $server (@servers) { 
  print "$server\n"; 
  foreach $service (@web_services) {
    $service_printed_once = 0;
    $Root_Path = "IIS://$server/$service"; 
    $IIS = Win32::OLE->GetObject( $Root_Path ); 
    if ($IIS) { 
      if (!$printed_once) {
        print "name =   $IIS->{Name}\n";
        $service_printed_once=1;
      }
      $enumIIS = Win32::OLE::Enum->new($IIS); 
      foreach $objSites ($enumIIS->All) { 
        print "\n";
        if (!($objSites->{Name} =~ /(Filters|Info|SSLKeys)/)) { 
          $ServerBindings = $objSites->{ServerBindings};
          $ServerState = $objSites->{ServerState};
          foreach $item (@{$ServerBindings}) {
            $item =~ /(.*):(.*):(.*)/;
            $IP = $1||"(All Unassigned)";
            $TCP = $2||"80";
      	  $hostheader = $3;
            print "    $IP ($TCP)";
            if ($hostheader ne "") {
              print "    HostHeader = $hostheader";
            }
            print "\n";
            print "    parent-object: $IIS->{Name}\n";
            print "    server-state: $server_states{$ServerState}\n";
            print "    name: $objSites->{Name}\n";
            print "    server-comment: $objSites->{ServerComment}\n";
            if ($service ne "msftpsvc") {
              print "    auth: ";
              if ($objSites->{AuthAnonymous}) {
                print "Anonymous ";
              } elsif ($objSites->{AuthBasic}) {
                print "Basic ";
              } elsif ($objSites->{AuthNTLM}) {
                print "NTLM ";
              }
              print "\n";

              if ($objSites->{EnableDefaultDoc}) {
                print "    Default Doc Enabled\n";
                if ($objSites->{DefaultDoc}) {
                  print "      default-doc: $objSites->{DefaultDoc}\n";
                } else {
                  print "    No Default Doc\n";
                }
              } else {
                print "    Default Doc Disabled\n";
              }
              do_sub_dir_work($objSites,0);
            }
          }
        }
      }
    }
  }
}

sub do_sub_dir_work {
  my $Sites = $_[0];
  my $indent = $_[1];
  my $dirs;
  my $enumSites;
  my $printed_once;
  $enumSites = Win32::OLE::Enum->new($Sites); 
  foreach $dirs (sort {lc($a) cmp lc($b)} $enumSites->All) { 
    if (lc($dirs->{Name}) ne "root") {
      if (!$printed_once) {
        print_whitespace($indent*2+2);
        $printed_once = 1;
        print "Sub-dirs:\n";
      }
      print_whitespace($indent*2+4);
    } else {
      print_whitespace($indent*2+4);
    }
    print "$dirs->{Name} - Directory Browsing";
    if ($dirs->{EnableDirBrowsing}) {
      print " Enabled\n";
    } else {
      print " Disabled\n";
    }
    print_whitespace($indent*2+6);
    print "auth: ";
    if ($dirs->{AuthAnonymous}) {
      print "Anonymous\n";
    } elsif ($dirs->{AuthBasic}) {
      print "Basic\n";
    } elsif ($dirs->{AuthNTLM}) {
      print "NTLM\n";
    }
    if (lc($dirs->{Name}) ne "root") {
      print_whitespace($indent*2+6);
    } else {
      print_whitespace(6);
    }

    print "Path: $dirs->{Path}\n";
    do_sub_dir_work($dirs,$indent+2);
  }
}

sub print_whitespace {
  $indent = $_[0];
  foreach (1 .. $indent) {
    print " ";
  }
}