Good to Know Database

C#: Windows-Passwort vor dem Ablaufen zurücksetzen


Viele Windows-Administratoren konfigurieren über die Gruppenrichtlinien (Group Policy), dass die Benutzerpasswörter nach einer vorgegebenen Zeit ablaufen und zwingen so den Benutzer das Passwort regelmäßig zu ändern. Diese Vorgehensweise ist für viele Benutzer eher lästig hat aber durchaus Ihre Berechtigung. Bei der Konfiguration dieses Mechanismusses kann der Administrator zum Beispiel vorgeben wie lange das Passwort gültig sein darf, welche Arten von Zeichen im Passwort vorkommen müssen und wie viele der bereits genutzten Passwörter gespeichert werden damit der Benutzer diese nicht erneut verwendet. Da sich viele Benutzer kein neues Passwort merken wollen, hängen Sie oft nur eine fortlaufende Zahl an Ihr altes Passwort an. Da in der Regel die letzten Passwörter gespeichert werden, kann man das Passwort auch so oft ändern, bis man wieder das alte Passwort verwenden kann. So kann also ein Benutzer die vom Administrator festgelegte Richtlinie umgehen.

Die hier gezeigte C#-Konsolenanwendung PreventPasswordExpiration kann von der Eingabeaufforderung aufgerufen werden und ändert mehrmals das Passwort des lokalen Benutzers oder des aktuell genutzten Domainenbenutzers bevor es wieder das ursprüngliche Passwort wiederherstellt. Als Argumente müssen Sie beim Aufruf zuerst das aktuelle Passwort und danach die Anzahl der gewünschten Passwortänderungen angeben. Nach dem Start des Programms ändert dieses fortlaufend das Benutzerpasswort und zeigt Ihnen das jeweils neue Passwort an. Sollte sich also das Passwort nicht ändern lassen, können Sie der Ausgabe das momentan gültige Passwort entnehmen. Nachdem das Passwort, wie über das zweite Argument festgelegt, mehrmals geändert wurde, wird das alte Benutzerpasswort wieder gesetzt.

/*
 * PreventPasswordExpiration
 *
 * This application can be used to change the password of your local windows
 * account or your domain user account several times before the old password
 * will be set back.
 *
 * Creation:    20.12.2013
 * Last Update: 05.01.2014
 *
 * Copyright (c) 2013-2014 by Georg Kainzbauer (http://www.gtkdb.de)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.DirectoryServices;

namespace PreventPasswordExpiration
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                System.Console.WriteLine("\nPreventPasswordExpiration v1.0");
                System.Console.WriteLine("Copyright (c) 2013-2014 by Georg Kainzbauer (http://www.gtkdb.de)");
                System.Console.WriteLine("\nUsage: PreventPasswordExpiration.exe <Password> <NumberOfChanges>");
                System.Environment.Exit(1);
            }

            string domain = Environment.UserDomainName;
            string username = Environment.UserName;
            string password = args[0];
            string oldPassword;
            string newPassword;
            string changes = args[1];
            int count;
            int i;

            System.Console.WriteLine("Domain:   " + domain);
            System.Console.WriteLine("Username: " + username);
            System.Console.WriteLine("Password: " + password);
            System.Console.WriteLine("Changes:  " + changes);

            DirectoryEntry entry = null;
            try
            {
                entry = new DirectoryEntry(@"WinNT://" + domain + "/" + username + ",User");
            }
            catch (System.Reflection.TargetInvocationException exception)
            {
                Exception cause = exception.InnerException;
                System.Console.WriteLine("\nERROR: " + cause.Message);
                System.Environment.Exit(1);
            }

            count = Convert.ToInt32(changes);
            oldPassword = password;
            for (i = 0; i < count; i++)
            {
                newPassword = password + Convert.ToString(i);
                ChangePassword(entry, oldPassword, newPassword);
                System.Console.WriteLine("\nPassword has changed successfully.");
                System.Console.WriteLine("Current password: " + newPassword);
                oldPassword = newPassword;
            }
            ChangePassword(entry, oldPassword, password);
            System.Console.WriteLine("\nPassword has changed successfully to the old password.");
        }

        static void ChangePassword(DirectoryEntry entry, string oldPassword, string newPassword)
        {
            try
            {
                entry.Invoke("ChangePassword", oldPassword, newPassword);
            }
            catch (System.Reflection.TargetInvocationException exception)
            {
                Exception cause = exception.InnerException;
                System.Console.WriteLine("\nERROR: " + cause.Message);
                System.Environment.Exit(1);
            }
        }
    }
}

Den hier gezeigten C#-Quellcode können Sie zum Beispiel mit Microsoft Visual Studio Express 2013 kompilieren.

Noch ein kleiner Hinweis zum Abschluss: In den Gruppenrichtlinien kann man auch einstellen, wie oft der Benutzer sein Passwort ändern darf. Wird hier zum Beispiel festgelegt, dass der Benutzer sein Passwort pro Tag nur ein Mal ändern darf, funktioniert das hier vorgestellte Programm verständlicherweise nicht mehr.

Weiterführende Tutorials

Visual Studio 2013: Verweise auf Assemblys zum Projekt hinzufügen


Dieser Eintrag wurde am 02.01.2014 erstellt und zuletzt am 24.01.2016 bearbeitet.

Direkter Link zu dieser Seite: http://www.gtkdb.de/index_38_2471.html

[ Zur Startseite ]   [ Zur Kategorie ]


Valid XHTML 1.0 Transitional Valid CSS Valid Atom 1.0

© 2004-2018 by Georg Kainzbauer