Здравствуйте.
Есть такой код:
string password = SecureStringToString(Password);
bool loginResult = Interop.Advapi32.LogonUser(UserName, Domain, password,
Interop.Advapi32.LOGON32.LOGON32_LOGON_BATCH, Interop.Advapi32.LOGON32.LOGON32_PROVIDER_DEFAULT,
out var tempUserToken);
if (loginResult)
{
return tempUserToken;
}
else
{
if (tempUserToken != null)
{
tempUserToken.Dispose();
}
throw new Win32Exception(Marshal.GetLastWin32Error());
}
Может ли функция LogonUser в случае неудачи вернуть токен, требующий освобожения (tempUserToken.Dispose()) или это тот кто писал функцию перестраховался?
ARI ARI ARI... Arrivederci!
Подозреваю, что в вашем случае tempUserToken — это не PHANDLE (точнее не примитивный C# тип, приводимый к PHANDLE),
а какая-то умная обертка над хэндлом. А логика проверки валидный/невалидный хэндл скрыта в Dispose этой обертки.
ARI ARI ARI... Arrivederci!
Здравствуйте, Somescout, Вы писали:
S>S> string password = SecureStringToString(Password);
S> bool loginResult = Interop.Advapi32.LogonUser(UserName, Domain, password,
S> Interop.Advapi32.LOGON32.LOGON32_LOGON_BATCH, Interop.Advapi32.LOGON32.LOGON32_PROVIDER_DEFAULT,
S> out var tempUserToken);
S> if (loginResult)
S> {
S> return tempUserToken;
S> }
S> else
S> {
S> if (tempUserToken != null)
S> {
S> tempUserToken.Dispose();
S> }
S> throw new Win32Exception(Marshal.GetLastWin32Error());
S> }
S>
S>Может ли функция LogonUser в случае неудачи вернуть токен, требующий освобожения (tempUserToken.Dispose()) или это тот кто писал функцию перестраховался?
1. Такой вопрос лучше задавать в
форуме по WINAPI. К дотнету он прямого отношения не имеет, т.к. всё упирается в поведение функции
LogonUser.
2. В документации сказано, что какой-либо токен образуется исключительно в случае успеха:
If the function succeeds, you receive a handle to a token that represents the logged-on user.
Так что выглядит всё так, что достаточно
public static SafeHandle LoginUser(string userName, string domain, SecureString sPassword)
=> Interop.Advapi32.LogonUser(userName, domain, SecureStringToString(password),
Interop.Advapi32.LOGON32.LOGON32_LOGON_BATCH,
Interop.Advapi32.LOGON32.LOGON32_PROVIDER_DEFAULT,
out var tempUserToken) ? tempUserToken : throw new Win32Exception(Marshal.GetLastWin32Error());