Hej Jag testade exact din kod och det funkade för mig, både mot min domän och mot lokalt konto på min maskin. När jag validerade mot lokal maskin skrev jag namnet på maskinen, inte . eller localhost eller nåt sådant. alltså, koden ovan fungerar utmärkt om man använder den på rätt sätt... t.ex. skickar in rätt parametrar. Hade lyckats får lösenordet på datornamnet och tvärtom... tacka f*n för att han inte vill logga in mig...Byta användare
Har tittat lite på nätet och hittat nedanstående kod. Dock får jag det aldrig att fungera. LogonUser returnerar alltid 0...
<code>
public class UserChanger
{
[DllImport("advapi32",CharSet=CharSet.Auto, SetLastError=true )]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("Kernel32")]
public static extern int GetLastError();
public static void Run(string un, string computer, string pw)
{
// The Windows NT user token.
IntPtr token1=IntPtr.Zero;
// Get the user token for the specified user, machine, and password using the unmanaged LogonUser method.
bool loggedOn = LogonUser(
// User name.
un,
// Computer name.
computer,
// Password.
pw,
// Logon type = LOGON32_LOGON_NETWORK_CLEARTEXT.
3,
// Logon provider = LOGON32_PROVIDER_DEFAULT.
0,
// The user token for the specified user is returned here.
ref token1);
Console.WriteLine("LogonUser called");
// Call GetLastError to try to determine why logon failed if it did not succeed.
if(loggedOn)
{
Console.WriteLine("LogonUser Success? " + loggedOn);
Console.WriteLine("NT Token Value: " + token1);
//Starting impersonation here:
Console.WriteLine("\n\nBefore impersonation:\n");
WindowsIdentity mWI1 = WindowsIdentity.GetCurrent();
Console.WriteLine(mWI1.Name);
Console.WriteLine(mWI1.Token);
IntPtr token2 = new IntPtr(token1.ToInt32());
Console.WriteLine("\n\nNew identity created:\n");
WindowsIdentity mWI2 = new WindowsIdentity(token2);
Console.WriteLine(mWI2.Name);
Console.WriteLine(mWI2.Token);
// Impersonate the user.
WindowsImpersonationContext mWIC = mWI2.Impersonate();
Console.WriteLine("\n\nAfter impersonation:\n");
WindowsIdentity mWI3 = WindowsIdentity.GetCurrent();
Console.WriteLine(mWI3.Name);
Console.WriteLine(mWI3.Token);
// Revert to previous identity.
mWIC.Undo();
Console.WriteLine("\n\nAfter impersonation is reverted:\n");
WindowsIdentity mWI4 = WindowsIdentity.GetCurrent();
Console.WriteLine(mWI4.Name);
Console.WriteLine(mWI4.Token);
}
else
{
int ret = GetLastError();
switch (ret)
{
case 1326:
Console.WriteLine("Unknown User/Password");
break;
case 1327:
Console.WriteLine("Account disabled");
break;
case 1331:
Console.WriteLine("Restricted by policies");
break;
default:
Console.WriteLine(ret.ToString());
break;
}
}
}
}
</code>
kör på XP men det borde väl inte spela nån roll? LastError är alltid 126..Sv: Byta användare
Om jag däremot skrev ett felaktigt användarnamn eller lösenord så fick jag alltid 126, inte 1326 som switch-stmt antyder.
Är du säker på att du anger rätt info till ditt anrop? Prova att skapa ett nytt konto lokalt på din maskin och använd det.
Ett alternativ är att du inte är behörig att anropa detta API. Är du t.ex. medlem i admingruppen på den lokala maskinen?
/MattiasSv: Byta anv&#228;ndare