Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

useradd for NT

by idnopheq (Chaplain)
on Apr 23, 2001 at 15:02 UTC ( #74683=sourcecode: print w/replies, xml ) Need Help??
Category: NT Admin
Author/Contact Info idnopheq
Description: useradd adds a user to a NT host a la the Solaris useradd utility.

TODO:

  • Modify for Win2K, domains
  • POD
  • Testing Testing Testing

This script is very BETA, hense the use diagnostics. But, I posted this for the logonhours part (works like net user syntax) and for folks who want to reuse solaris useradmin scripts on NT.

#!/usr/local/bin/perl -w
#-*-perl-*-
# ------ Create a new user

use strict;
use Win32;
use Win32::NetAdmin;
use Win32API::Net;
use Getopt::Std;
use diagnostics;

use vars qw( %Option %args %Account %Share @opts %Day %Daynames @logon
+hours $Error );

my ($VERSION) = '$Revision: 2.0 $' =~ /([.\d]+)/;

my $warnings = 0;

# Print a usuage message on a unknown option.

$SIG {__WARN__} = sub {
    if (substr ($_ [0], 0, 14) eq "Unknown option") {die "Usage"};
    require File::Basename;
    $0 = File::Basename::basename ($0);
    $warnings = 1;
    warn "$0: @_";
};

$SIG {__DIE__} = sub {
    require File::Basename;
    $0 = File::Basename::basename ($0);
    if (substr ($_ [0], 0,  5) eq "Usage") {
        die <<EOF;
$0 (NT Perl bin utils) $VERSION
$0 [ -c comment ][ -f fullname ][ -h home dir ][ -m ][ -e expire ]
        [ -l logon script ][ -g group ][ -t logonhours] username
EOF
    }
    die "$0: @_";
};

# Get the options.

getopts ( 
     'c:f:h::e:l:G:g:t:m',
      \%Option 
    );                    # 

die "Usage" unless @ARGV;

# don't waste time if the user exists

my $Server     = "";
Existance();

# set default values unless defined

$Option{'h'} ||= "$ENV{SystemRoot}\\Profiles\\$ARGV[0]";
$Option{'c'} ||= "Normal User";
$Option{'f'} ||= "";
$Option{'e'} ||= "30";
$Option{'l'} ||= "";
$Option{'g'} ||= "Users";
$Option{'t'} ||= "0";
$Option{'E'} ||= "0";

# set up the account hash

my $Level = "3";
%Account = (
        'acctExpires'     => "-1", # 30 days,
        'authFlags'       => "",
        'badPWCount'      => "",
        'codePage'        => "",
        'comment'         => $Option{'c'},
        'countryCode'     => "",
        'flags'           => "513",
        'fullName'        => $Option{'f'},
        'homeDir'         => $Option{'h'},
        'homeDirDrive'    => "",
        'lastLogon'       => "",
        'lastLogoff'      => "",
        'logonHours'      => $Option{'t'},
        'logonServer'     => "",
        'maxStorage'      => "-1",
        'name'            => $ARGV[0],
        'numLogons'       => "",
        'parms'           => "",
        'password'        => 'testpassword', 
        'passwordAge'     => "",
        'passwordExpired' => $Option{'E'},
        'primaryGroupId'  => "0x201",
        'priv'            => "1",
        'profile'         => "",
        'scriptPath'      => $Option{'l'},
        'unitsPerWeek'    => "168",
        'userId'          => "",
        'usrComment'      => "$Option{'f'} - $Option{'c'}",
        'workstations'    => "",
       );

$Account{acctExpires} = time + ( $Option{'e'} * 8640 ) if exists $Opti
+on{'e'};
# $Account{name} = $ARGV[0];

AddUser();
# AddUser2Group();
exit 1;

sub Existance {
  if ( Win32::NetAdmin::UsersExist ( 
                    $Server,
                    $ARGV[0] 
                   ) ) {
    print "$ARGV[0] exists on $Server ... nothing to do\n";
    exit 1;
  } else {
    print "$ARGV[0] does not exist ... building ... ";
  }
}

sub AddUser {
  if (
      ! Win32API::Net::UserAdd( 
                   $Server,
                   $Level,
                   \%Account,
                   $Error
                  ) ) {
    print "Sorry, something went wrong; error: $^E\n";
    exit 1; 
  } else {
    print "$Account{name} built ... \n";
  }
}

sub AddUser2Group {
  if (!Win32::NetAdmin::LocalGroupAddUsers( 
                       $Server, 
                       $Option{'g'}, 
                       $Account{name}
                      ) ) { 
    print "Sorry, something went wrong: error: $^E\n"; 
    exit 1; 
  }
  print "added $Account{name} to group ... \n";
}


sub MakeHome {
  %Share = (
        'path'          => "c:\\home\\$Account{name}",
        'netname'       => "$Account{name}",
        'maxusers'      => -1,
        'remark'        => "$Account{full_name}",
        'passwd'        => "",
        'current-users' => 0,
        'permissions'   => 0,
        'type'          => 0,
       );

  mkdir ("\\\\$Server\\c\$\\home\\$Account{name}",
     0777) || print "Error creating home dir: $!\n";
  if ( Win32::NetResource::NetShareAdd( \%Share, 
                    my $Param, 
                    "\\\\$Server" ) ) {
    print "Successfully shared $Share{path} as $Share{netname}.\n";
  } else {
    print "Failed to share $Share{path} as $Share{netname}.\n";
    #     Win32::NetResource::GetError( $Error2 );
    #     if( my $Error == ERROR_EXTENDED_ERROR )
    #     {
    #         Win32::NetResource::WNetGetLastError( $Error, 
    #                           my $Text, 
    #                           my $Provider );
    #         $Text .= " ($Provider)";
    #     }else{
    #         $Text = Win32::FormatMessage( $Error );
    #     }
    #     print "Error $Error: $Text";
  }
}

sub LogonHours {

  @logonhours = ("000000000000000000000000",
         "000000000000000000000000",
         "000000000000000000000000",
         "000000000000000000000000",
         "000000000000000000000000",
         "000000000000000000000000",
         "000000000000000000000000");

  %Day        = ( 
         "Su" => "0",
         "M"  => "1",
         "T"  => "2",
         "W"  => "3",
         "Th" => "4",
         "F"  => "5",
         "Sa" => "6",
        );

  %Daynames   = (
         "Sunday"    => "Su",
         "Monday"    => "M",
         "Tuesday"   => "T",
         "Wednesday" => "W",
         "Thursday"  => "Th",
         "Friday"    => "F",
         "Saturday"  => "Sa",
        );

  if (!@_) {
    die "Syntax!\n";
  }

  @opts = split (/,/, $_[0]);

  if ($opts[0] =~ /all/i) {
    for (@logonhours) {
      s/0/1/g;
    }
  } else {
    while (@opts) {
      my ($first,
      $last);
      if ($opts[0] =~ /^[MTWF||Th||Sa||Su].*/i) {
    my $dow = ucfirst $opts[0];
    if ($dow =~ /-/) {
      ($first,
       $last) = split (/-/, $dow);
      $last = ucfirst $last;
      if (exists $Daynames{$first}) {
        $first = $Daynames{$first};
      } else {
        if (!exists $Day{$first}) {
          die "Invalid day syntax $first!\n";
        }
      }
      if (exists $Daynames{$last}) {
        $last = $Daynames{$last};
      } else { 
        if (!exists $Day{$first}) {
          die "Invalid day syntax $last!\n";
        }
      }
      if ($Day{$last} - $Day{$first} < 0) {
        push @opts, "Su-$last";
        push @opts, $opts[1];
        $last = "Sa";
      }
    } else {
      if (exists($Daynames{$dow})) {
        $dow = $Daynames{$dow};
      } elsif (!exists($Day{$dow})) {
        die "Invalid day syntax $last!\n";
      }
      $first = $last = $dow;
    }
    shift @opts;
      }
      if ($opts[0] =~ /^[0-9]/) {
    if ($opts[0] =~ /-/) {
      my $time = $opts[0];
      my ($begin,
          $end) = split (/-/, $time);
      if ($begin =~ s/pm//i) {
        if ($begin <= 12) {
          $begin = $begin + 12;
        }
      } elsif ($begin =~ s/am//i) {
        if ($begin == 12) {
          $begin = "0";
        }
      }
      if ($end =~ s/pm//i) {
        if ($end < 12) {
          $end = $end + 12;
        }
      } elsif ($end =~ s/am//i) {
        if ($end == 12) {
          $end = "23";
        }
      }
      if ($end - $begin < 0) {
        die "Invalid time syntax in $time\n";
      }
      for (my $q = $Day{$first}; $q <= $Day{$last}; $q++) {
        my $bitstr = "0";
        if ($begin == "0") {
          $bitstr = "1";
        }
        for (my $i = 1; $i <= 23; $i++) {
          if ($i < $begin || $i > $end) {
        $bitstr = $bitstr . "0";
          } else {
        $bitstr = $bitstr . "1";
          }
        }
        $logonhours[$q] = $bitstr;
      }
      shift @opts;
    } else {
      die "Invalid time syntax: $opts[0]\n";
    }
      } else {
    die "Invalid time syntax: $opts[0]\n";
      }
    }
  }

  # foreach (@logonhours) {
  #   print $_ . "\n";
  # }
  my $LogonHours = pack("b168",
            join ('',
                  @logonhours));
  return $LogonHours;
  # print $LogonHours ."\n";

}
Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://74683]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (4)
As of 2016-09-25 04:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Extraterrestrials haven't visited the Earth yet because:







    Results (463 votes). Check out past polls.