Попробуйте этот код (ПРИМЕЧАНИЕ: Сообщается, что он не работает на сервере Windows 2000)
#region NTLogonUser
#region Direct OS LogonUser Code
[DllImport( "advapi32.dll")]
private static extern bool LogonUser(String lpszUsername,
String lpszDomain, String lpszPassword, int dwLogonType,
int dwLogonProvider, out int phToken);
[DllImport("Kernel32.dll")]
private static extern int GetLastError();
public static bool LogOnXP(String sDomain, String sUser, String sPassword)
{
int token1, ret;
int attmpts = 0;
bool LoggedOn = false;
while (!LoggedOn && attmpts < 2)
{
LoggedOn= LogonUser(sUser, sDomain, sPassword, 3, 0, out token1);
if (LoggedOn) return (true);
else
{
switch (ret = GetLastError())
{
case (126): ;
if (attmpts++ > 2)
throw new LogonException(
"Specified module could not be found. error code: " +
ret.ToString());
break;
case (1314):
throw new LogonException(
"Specified module could not be found. error code: " +
ret.ToString());
case (1326):
// edited out based on comment
// throw new LogonException(
// "Unknown user name or bad password.");
return false;
default:
throw new LogonException(
"Unexpected Logon Failure. Contact Administrator");
}
}
}
return(false);
}
#endregion Direct Logon Code
#endregion NTLogonUser
за исключением того, что вам нужно создать собственное собственное исключение для "LogonException"
---
Не используйте обработку исключений для возврата информации из метода. «Неизвестное имя пользователя или неверный пароль» не является исключением, это стандартное поведение для LogonUser. Просто верните ложь. – Treb 14 нояб. 2008, в 16:20
да ... это был порт из старой библиотеки VB6 ... написанный 2003 или около того ... (когда впервые вышел .Net) – Charles Bretana 17 нояб. 2008, в 15:18
При работе в Windows 2000 этот код не будет работать ( support.microsoft.com/kb/180548 ) – Ian Boyd 01 дек. 2008, в 14:58
Переосмысливая это. Вход в систему Ожидаемое поведение пользователя, его цель - войти в систему . Если он не в состоянии выполнить эту задачу, это исключение. Фактически, метод должен возвращать void, а не Boolean. Кроме того, если вы только что вернули логическое значение, потребитель метода не сможет сообщить пользователю причину сбоя. – Charles Bretana 24 май 2018, в 12:34