Вопрос по interop
От: Somescout  
Дата: 26.09.19 09:51
Оценка:
Здравствуйте.

Есть такой код:

            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!
Re: Вопрос по interop
От: RushDevion Россия  
Дата: 26.09.19 11:03
Оценка:
Подозреваю, что в вашем случае tempUserToken — это не PHANDLE (точнее не примитивный C# тип, приводимый к PHANDLE),
а какая-то умная обертка над хэндлом. А логика проверки валидный/невалидный хэндл скрыта в Dispose этой обертки.
Re[2]: Вопрос по interop
От: Somescout  
Дата: 26.09.19 12:02
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Подозреваю, что в вашем случае tempUserToken — это не PHANDLE (точнее не примитивный C# тип, приводимый к PHANDLE),

RD>а какая-то умная обертка над хэндлом. А логика проверки валидный/невалидный хэндл скрыта в Dispose этой обертки.

Это я дописал, изначально там был IntPtr и Kernel.CloseHandle вместо Dispose.
ARI ARI ARI... Arrivederci!
Re: Вопрос по interop
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.09.19 03:26
Оценка: 18 (1)
Здравствуйте, 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());
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.