Automatische Anmeldung


r_maniac

Grünschnabel
Halo!
ich arbeite momentan an einen project wo ich auch unter anderen windows login funktion realisieren soll.

gibt es vieleicht eine möglichkeit mit .net (c sharp) in ein dienst loginfunktion zu intergrieren ? fieleicht ein konsole command oder .net methode für automatisazion.:confused:
 

r_maniac

Grünschnabel
Hab gestern eibischen mit Windows SDK gespielt:

Habe folgendes ausgefunden:
mit funktion LogonUser kann man(theoretisch) Windows benutzer auf lokalen PC anmelden
Code:
[DllImport("advapi32.dll")]
        public static extern bool LogonUser(string lpszUsername, string lpszDomain, string Password, int dwLogonType, int dwLogonProvider, out int phToken);
aber dabei habe ich auf folgende problem gestossen - wenn ich folgende code ausfüren lasse(einfache Form mit button) meldet mir programm dass benutzer erfogreich angemeldet ist... in task manager sehe ich aber nur mich selbst als angemeldete user. könnte mir jemand sagen wo lieg das Problem

Code:
private void login_Click(object sender, EventArgs e)
        {
            string uid = "test",pwd="test";
            int token1;
            if (LogonUser(uid, ".", pwd, 2, 0, out token1))
            {
                System.Windows.Forms.MessageBox.Show("Benutzer login erfolgreich", "",
                           System.Windows.Forms.MessageBoxButtons.OK,
                           System.Windows.Forms.MessageBoxIcon.Information);
            }
            else
            {
                System.Windows.Forms.MessageBox.Show("Benutzer login fehlgeshlagen", "",
                           System.Windows.Forms.MessageBoxButtons.OK,
                           System.Windows.Forms.MessageBoxIcon.Information);
            }
dabei wird ja der paswort und die name überprüft, denn wenn ich falsche angabe mache wird von fehler berichtet
 

RudolfG

Erfahrenes Mitglied
Hi,

was möchtest du den mit diesem angemeldeten Benutzer machen?

Laut der Doku wird dir bei erfolgreicher Anmeldung ein Token des Benutzers zurückgeliefert, mit diesem kannst du dann z. B. Prozesse als dieser Benutzer starten.

Mit Hilfe dieser Funktion kann man für kritische Funktionen z. B. das Admin-Passwort überprüfen lassen und dann ein Programm als "Administrator" starten etc.

Für die "wirkliche" Anmeldung ist diese Funktion nicht geeignet.

Gruß
RudolfG
 

Thomas Darimont

Premium-User
Hallo,

schau mal hier:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Principal;
using System.Runtime.InteropServices;
using System.Security.Permissions;

namespace De.Tutorials.Training.Core
{
    class Program
    {

        [DllImport("advapi32.dll",  SetLastError=true, CharSet = CharSet.Unicode)]
        public static extern bool LogonUser(String lpszUsername, String lpszDomain,  String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public extern static bool CloseHandle(IntPtr handle);

        static void Main(string[] args)
        {
            WindowsIdentity id = System.Security.Principal.WindowsIdentity.GetCurrent();
            Console.WriteLine("CurrentUser: " + id.Name);


            string username = "foo";
            string domain = "box";
            string password = "foofoofoo";

            IntPtr fooUserToken = IntPtr.Zero;

            bool logonSuccessfull = LogonUser(
                                        username,
                                        domain,
                                        password,
                                        3, //LOGON32_LOGON_NETWORK
                                        0, //LOGON32_PROVIDER_DEFAULT
                                    ref fooUserToken);

            Console.WriteLine(logonSuccessfull);

            using (WindowsIdentity identity = new WindowsIdentity(fooUserToken))
            {
                CloseHandle(fooUserToken);

                Console.WriteLine("New Identity: " + identity.Name);

                using (WindowsImpersonationContext impersonation = identity.Impersonate())
                {

                    id = System.Security.Principal.WindowsIdentity.GetCurrent();
                    Console.WriteLine("CurrentUser: " + id.Name);
                    Console.WriteLine("Leaving impersonated user... on dispose");
                }

                id = System.Security.Principal.WindowsIdentity.GetCurrent();
                Console.WriteLine("CurrentUser: " + id.Name);
            }
        }
    }
}
Ausgabe:
Code:
CurrentUser: box\tom
True
New Identity: box\foo
CurrentUser: box\foo
Leaving impersonated user... on dispose
CurrentUser: box\tom
Drücken Sie eine beliebige Taste . . .
Gruß Tom