Re[2]: Детект прав админа у пользователя
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.03.24 15:25
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А потом по нему получить WindowsPrincipal


До сюда все пучком...

PD>и проверить роль


PD>https://stackoverflow.com/questions/3600322/check-if-the-current-user-is-administrator


А вот это не работает.

    public static bool IsLoginLocalAdministrator(string userName, string domainName, string password)
    {
        SafeTokenHandle safeTokenHandle;
        try
        {
            const int LOGON32_PROVIDER_DEFAULT = 0;
            //This parameter causes LogonUser to create a primary token.
            const int LOGON32_LOGON_INTERACTIVE = 2;

            // Call LogonUser to obtain a handle to an access token.
            bool returnValue = LogonUser(userName, domainName, password,
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                out safeTokenHandle);

            if (!returnValue)
            {
                var ret = Marshal.GetLastWin32Error();
                throw new System.ComponentModel.Win32Exception(ret);
            }

            using (safeTokenHandle)
            {
                using WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle());
                return WindowsIdentity.RunImpersonated(newId.AccessToken, () =>
                    {
                        // Вот тут возвращает false на учетку локального админа :(
                        return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
                    });
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Exception occurred. " + ex.Message);
        }

        return false;
    }


При этом в списке права локального админа есть:


ЧЯДНТ?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 29.03.2024 15:49 VladD2 . Предыдущая версия . Еще …
Отредактировано 29.03.2024 15:35 VladD2 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.