Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

passwd for NT/2K

by idnopheq (Chaplain)
on Apr 23, 2001 at 14:03 UTC ( #74670=sourcecode: print w/replies, xml ) Need Help??
Category: NT Admin
Author/Contact Info idnopheq
Description: passwd -- change login password.

passwd changes the password or lists password attributes associated with the user's login name (userid) <- Not yet implemented.

When used to change a password, passwd prompts everyone for their old password, if any. It then prompts for the new password twice.

If executed by a user with USER_PRIV_ADMIN() privilege flag (i.e. super-user), the old password prompt does not appear.

Passwords must be constructed to meet the operating system requirements

TODO: Add password attribute listing

#!/usr/local/bin/perl -w
#-*-perl-*-
#

use strict;
use vars qw ( %UserInfo %CallerUserInfo $OPasswd );
use Win32;
use Win32::NetAdmin;
use Term::ReadKey;
use Win32API::Net;
use File::Spec;

my ($VERSION) = '$Revision: 1.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 [ userid ] [-h]
EOF
    }
    die "$0: @_";
};

die "Usage" 
  if ( exists $ARGV[0] && $ARGV[0] eq "-h" );

my $Level           = "1003";
my $UserName        = $ARGV[0] || getlogin;
my $Server          = "";
my $Error           = -1;
my $CallerPriv      = GetCallerPriv() || "0";
my $Executable      = ( File::Spec->splitpath( $0 ) )[2];

CheckUser();

print "Changing password for $UserName\n";

( 
 $OPasswd,
 $UserInfo{password}
)                   = PasswordPrompt();

if ( $CallerPriv < "2" ) {
    Win32API::Net::UserChangePassword (
                       $Server,
                       $UserName,
                       $OPasswd,
                       $UserInfo{password}
                      ) 
    or die "\n$^E\n"; 
}
if ( $CallerPriv == "2" ) {
    Win32API::Net::UserSetInfo ( 
                $Server,
                $UserName,
                $Level,
                \%UserInfo,
                $Error
                   ) 
    or die "\n$^E\n"; 
}

print "\n$Executable: all authentication tokens updated successfully\n
+";

sub GetCallerPriv {
    my $Caller = getlogin;
    Win32API::Net::UserGetInfo (
                $Server,
                $Caller,
                "11",
                \%CallerUserInfo 
                   );

    return $CallerUserInfo{priv};
}

sub PasswordPrompt {
    my (
       $OldPassword,
       $NewPassword1
       );

    unless ( $CallerPriv == 2 ) {
    print "(current) login password: ";
    ReadMode 'noecho';
    $OldPassword = ReadLine 0;
    chomp $OldPassword;
    print "\n";
    }
    for ( my $Accumulator = 0; $Accumulator < 3;  $Accumulator++ ) {
    print "New login password: ";
    ReadMode 'noecho';
    my $NewPassword0 = ReadLine 0;
    chomp $NewPassword0;
    print "\nRetype new login password: ";
    ReadMode 'noecho';
    $NewPassword1 = ReadLine 0;
    chomp $NewPassword1;
    
    last if $NewPassword0 eq $NewPassword1;
    print "\npasswords do not match\n";
    if ( $Accumulator >= "3" ) {
        print "exiting ...\n";
        die;
    }
    }
    return $OldPassword, $NewPassword1;
}

sub CheckUser {
    die "$Executable: unknown username \'$UserName\'\n" 
      if ! Win32::NetAdmin::UsersExist (
                    $Server,
                    $UserName
                       );
}

__END__

=pod

=head1 NAME

B<passwd> -- change login password.

=head1 SYNOPSIS

B<passwd> [ I<userid> ] [ -h ]

=head1 DESCRIPTION

B<passwd> changes the password or lists password attributes associated
+ with the user's login name (userid).

When used to change a password, B<passwd> prompts everyone for their o
+ld password, if any. It then prompts for the new password twice.

If executed by a user with USER_PRIV_ADMIN() privilege flag (i.e. supe
+r-user), the old password prompt does not appear.

Passwords must be constructed to meet the operating system requirement
+s

=head2 OPTIONS

B<passwd> accepts the options described below.

=over 4

=item B<userid>

The userid to perform a password reset.  If null, the current user's p
+assword will be reset.

=item B<-h>

Display syntax.

=back

=head1 ENVIRONMENT

The working of B<passwd> is not influenced by any environment variable
+s.

=head1 BUGS

B<passwd> does not work will in a Samba domain controller environment 
+(so far).

=head1 STANDARDS

It does not make sense to talk about standards in a B<passwd> manual p
+age.

=head1 REVISION HISTORY

    passwd
    Revision 1.0  2000/06/22 09:00:34  idnopheq
    Initial revision

=head1 AUTHOR

The Perl implementation of B<passwd> was written by Dexter Coffin, I<i
+dnopheq@home.com>.

=head1 COPYRIGHT and LICENSE

This program is copyright by Dexter Coffin 2000.

This program is free and open software. You may use, copy, modify, dis
+tribute,
and sell this program (and any modified variants) in any way you wish,
provided you do not restrict others from doing the same.

=head1 SEE ALSO

=head1 NEXT TOPIC

=cut
Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://74670]
help
Chatterbox?
[Corion]: Meh. I need to find myself a better "programming" feed than r/programming (which is just HackerNews reposts and advertisements, very little code). Maybe I should select a list of links that I liked on r/programming and then google for ...
[Corion]: ... an aggregator site that also listed (ideally) all of these links once. And maybe also have an exclude list to blacklist some of the most spammy links that the site may have never mentioned at all
[marto]: I gave up reading HN at all, and feel much better for it :P
[Corion]: Now, how to best automate that Google search ... :-)
[Corion]: marto: Yeah, I'm also short of not reading it at all. I already stopped reading it in the morning because it gave me a foul mood.
[Corion]: The good posts on HN are the non-computing posts. Most of the other stuff is maybe relevant to you if you are 20 and live in Silicon Valley...
[Corion]: Two attributes that don't describe me.
[Corion]: Maybe I should also write a curator for HN or simply not read it anymore, like you do.

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (8)
As of 2017-07-24 13:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    I came, I saw, I ...
























    Results (354 votes). Check out past polls.