Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/103: Рейтинг темы: голосов - 103, средняя оценка - 4.89
4 / 4 / 4
Регистрация: 21.04.2014
Сообщений: 139
1

Проверка прав администратора

28.06.2014, 15:28. Показов 20492. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Для работы моего приложения нужны права администратора, как проверить с какими правами запустилась программа
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.06.2014, 15:28
Ответы с готовыми решениями:

Проверка прав администратора у другого процесса
Здравствуйте, каким образом можно определить, есть ли права администратора у какого-либо чужого!...

Запуск из приложения с правами администратора, приложения без прав администратора
Как сделать подобный запуск?

Запрос приложения на получение прав администратора
Здравствуйте, подскажите пожалуйста: программе для корректной работы нужны права администратора,...

Как записать настройки программы без прав администратора?
Если записывать настройки через Properties.Settings, то на компьютере, где нет прав администратора...

12
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
28.06.2014, 15:55 2
первая ссылка в гугле - http://stackoverflow.com/quest... e-checking
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.06.2014, 22:35 3
valera_21, не работает Этот код проверяет просто, является ли текущий пользователем членом группы администраторов, а вот про запуск "runas" он ничего не говорит, а это две больше разницы

A_N_A_N_A_S, на форуме пару месяцев назад обсуждалось, решение находилось, поищите поиском.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
28.06.2014, 22:55 4
Цитата Сообщение от Psilon Посмотреть сообщение
Этот код проверяет просто, является ли текущий пользователем членом группы администраторов, а вот про запуск "runas" он ничего не говорит, а это две больше разницы
А Вы про какой именно код говорите ?
Я пробовал вот этот:
C#
1
2
3
4
bool isElevated;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
Запускаем на Windows 7 (UAC включен) от имени администратора - получаем True.
Запускаем просто из консоли - получаем False.
Разве это не то, что нужно топикстартеру ?
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
28.06.2014, 23:28 5
Убежденный, ну у меня он пишет true в любом случае. Даже если под дебагом в студии запустить
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
28.06.2014, 23:47 6
Цитата Сообщение от Psilon Посмотреть сообщение
Убежденный, ну у меня он пишет true в любом случае.
Хм... И что, прав админа при этом все равно нет ?
Ну то есть, нельзя, к примеру, писать в тот же HKLM и системные папки ?

Кстати, какой, на Ваш взгляд, правильный способ в .NET проверки
наличия администраторских прав ? Что-то верной ссылки я не нашел.
В WinAPI я всегда делал это через CheckTokenMembership с админским
SID-ом, т.е. S-1-5-32-544, это корректно работает на XP-Vista-7-8-8.1,
включая ситуации с отключенным UAC и всякими Admin Approval Mode.
0
209 / 174 / 48
Регистрация: 20.09.2012
Сообщений: 481
29.06.2014, 00:08 7
Цитата Сообщение от A_N_A_N_A_S Посмотреть сообщение
Для работы моего приложения нужны права администратора, как проверить с какими правами запустилась программа
а зачем проверять? Можно сразу запускать от имени админа без проверки с помощью manifest.app
XML
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.06.2014, 00:15 8
Цитата Сообщение от pokerface Посмотреть сообщение
а зачем проверять? Можно сразу запускать от имени админа без проверки с помощью manifest.app
1) XP, неадминистраторская учетка.
2) Vista и выше, неадминистраторская учетка, UAC выключен.
В обоих случаях наличие манифеста с requireAdministrator не поможет,
программа будет запущена с ограниченными правами.
2
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.06.2014, 01:50 9
Цитата Сообщение от Убежденный Посмотреть сообщение
Хм... И что, прав админа при этом все равно нет ?
Ну то есть, нельзя, к примеру, писать в тот же HKLM и системные папки ?
нет, нету

у меня на работе в этом есть прикол. Есть батник, который добавляет правила маршрутизации. Так вот, несмотря на то, что я админ всея компа и тп, могу писать что угодно куда угодно, если я не запускаю его с runas, то он правило не добавляет И галочка в winservice что "запускать с наивысшими правами" не помогает. То есть только вручную нажать на шилдик. Ну или использовать кучу кода (опять же, где-то я его приводил, с msdn"а или какого-то другого мсовского сайта).
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.06.2014, 10:47 10
Лучший ответ Сообщение было отмечено OwenGlendower как решение

Решение

Цитата Сообщение от Psilon Посмотреть сообщение
Есть батник, который добавляет правила маршрутизации. Так вот, несмотря на то, что я админ всея компа и тп, могу писать что угодно куда угодно, если я не запускаю его с runas, то он правило не добавляет
Так в этом и суть UAC: даже если ты администратор, реальные администраторские
права для процесса выдаются лишь по запросу. Если, конечно, UAC не выключен или
не настроен специальным образом через локальные политики безопасности.
Меня больше удивляет вот это:

Цитата Сообщение от Psilon
Цитата Сообщение от Убежденный
И что, прав админа при этом все равно нет ?
нет, нету
Что-то не могу придумать ситуацию, при которой такое возможно.
По логике вещей, если WindowsPrincipal.IsInRole возвращает true, значит access
token процесса содержит SID администратора. А это, в свою очередь, означает,
что проверка прав на запись при запросах доступа к системным объектам
(HKLM, System32 и т.д.) будет проходить успешно, так как там сравниваются
именно SID-ы.

Меня, правда, смущает описание метода WindowsIdentity.GetCurrent в MSDN:

http://msdn.microsoft.com/en-u... 49sw0.aspx
WindowsIdentity.GetCurrent Method

Returns a WindowsIdentity object that represents the current Windows user.
Что есть "current Windows user" в данном случае ? Залогиненный в сессии
процесса юзер или юзер, в контексте которого выполняется данный процесс/поток ?
Если первое, тогда функция всегда возвращала бы True для администратора, даже
если процесс не имеет админского SID-а (а следовательно, и прав на запись в
HKLM и системные папки). Но проблема в том, что у меня на "голой" Windows 7 с
включенным UAC она стабильно возвращает False, если только не запускать
программу от имени администратора, тогда True.

Вот нашел статью в базе знаний Microsoft, там есть примеры кода:

KB 981778
How to self-elevate an application to a high privilege level under UAC
http://support.microsoft.com/kb/981778/en

IsUserInAdminGroup

Функция определяет, является ли пользователь членом группы "Администраторы".
Для этого она извлекает полный токен процесса, если такой токен есть, и
проверяет наличие в нем соответствующего идентификатора безопасности (SID).
Сам процесс при этом может быть запущен с фильтрованнм (ограниченным)
токеном, не имея администраторских прав. Очень, кстати, похоже на описываемую
ситуацию с "IsAdmin = True, but HKLM Write = False".
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/// <summary>
/// The function checks whether the primary access token of the process belongs 
/// to user account that is a member of the local Administrators group, even if 
/// it currently is not elevated.
/// </summary>
/// <returns>
/// Returns true if the primary access token of the process belongs to user 
/// account that is a member of the local Administrators group. Returns false 
/// if the token does not.
/// </returns>
/// <exception cref="System.ComponentModel.Win32Exception">
/// When any native Windows API call fails, the function throws a Win32Exception 
/// with the last error code.
/// </exception>
internal bool IsUserInAdminGroup()
{
    bool fInAdminGroup = false;
    SafeTokenHandle hToken = null;
    SafeTokenHandle hTokenToCheck = null;
    IntPtr pElevationType = IntPtr.Zero;
    IntPtr pLinkedToken = IntPtr.Zero;
    int cbSize = 0;
 
    try
    {
        // Open the access token of the current process for query and duplicate.
        if (!NativeMethod.OpenProcessToken(Process.GetCurrentProcess().Handle,
            NativeMethod.TOKEN_QUERY | NativeMethod.TOKEN_DUPLICATE, out hToken))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
 
        // Determine whether system is running Windows Vista or later operating 
        // systems (major version >= 6) because they support linked tokens, but 
        // previous versions (major version < 6) do not.
        if (Environment.OSVersion.Version.Major >= 6)
        {
            // Running Windows Vista or later (major version >= 6). 
            // Determine token type: limited, elevated, or default. 
 
            // Allocate a buffer for the elevation type information.
            cbSize = sizeof(TOKEN_ELEVATION_TYPE);
            pElevationType = Marshal.AllocHGlobal(cbSize);
            if (pElevationType == IntPtr.Zero)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
 
            // Retrieve token elevation type information.
            if (!NativeMethod.GetTokenInformation(hToken, 
            TOKEN_INFORMATION_CLASS.TokenElevationType, pElevationType,
                cbSize, out cbSize))
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
 
            // Marshal the TOKEN_ELEVATION_TYPE enum from native to .NET.
            TOKEN_ELEVATION_TYPE elevType = (TOKEN_ELEVATION_TYPE)
            Marshal.ReadInt32(pElevationType);
 
            // If limited, get the linked elevated token for further check.
            if (elevType == TOKEN_ELEVATION_TYPE.TokenElevationTypeLimited)
            {
                // Allocate a buffer for the linked token.
                cbSize = IntPtr.Size;
                pLinkedToken = Marshal.AllocHGlobal(cbSize);
                if (pLinkedToken == IntPtr.Zero)
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
 
                // Get the linked token.
                if (!NativeMethod.GetTokenInformation(hToken,
                TOKEN_INFORMATION_CLASS.TokenLinkedToken, pLinkedToken,
                    cbSize, out cbSize))
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
 
                // Marshal the linked token value from native to .NET.
                IntPtr hLinkedToken = Marshal.ReadIntPtr(pLinkedToken);
                hTokenToCheck = new SafeTokenHandle(hLinkedToken);
            }
        }
                
        // CheckTokenMembership requires an impersonation token. If we just got 
        // a linked token, it already is an impersonation token.  If we did not 
        // get a linked token, duplicate the original into an impersonation 
        // token for CheckTokenMembership.
        if (hTokenToCheck == null)
        {
            if (!NativeMethod.DuplicateToken(hToken,
                SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
                out hTokenToCheck))
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
        }
 
        // Check if the token to be checked contains admin SID.
        WindowsIdentity id = new WindowsIdentity(hTokenToCheck.DangerousGetHandle());
        WindowsPrincipal principal = new WindowsPrincipal(id);
        fInAdminGroup = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    finally
    {
        // Centralized cleanup for all allocated resources. 
        if (hToken != null)
        {
            hToken.Close();
            hToken = null;
        }
        if (hTokenToCheck != null)
        {
            hTokenToCheck.Close();
            hTokenToCheck = null;
        }
        if (pElevationType != IntPtr.Zero)
        {
            Marshal.FreeHGlobal(pElevationType);
            pElevationType = IntPtr.Zero;
        }
        if (pLinkedToken != IntPtr.Zero)
        {
            Marshal.FreeHGlobal(pLinkedToken);
            pLinkedToken = IntPtr.Zero;
        }
    }
    return fInAdminGroup;
}


IsRunAsAdmin

Функция проверяет, имеет ли процесс права администратора.
Код аналогичен тому, что приводился на stackoverflow.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/// <summary>
/// The function checks whether the current process is run as administrator.
/// In other words, it dictates whether the primary access token of the 
/// process belongs to user account that is a member of the local 
/// Administrators group and it is elevated.
/// </summary>
/// <returns>
/// Returns true if the primary access token of the process belongs to user 
/// account that is a member of the local Administrators group and it is 
/// elevated. Returns false if the token does not.
/// </returns>
internal bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}


IsProcessElevated

Функция определяет, запущен ли процесс с полным или ограниченным токеном.
Имеет смысл только для Windows Vista и выше. Результат, по идее, должен быть
таким же, как у IsRunAsAdmin, хотя интересно бы проверить данную функцию с
отключенным UAC.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/// <summary>
/// The function gets the elevation information of the current process. It 
/// dictates whether the process is elevated or not. Token elevation is only 
/// available on Windows Vista and newer operating systems, thus 
/// IsProcessElevated throws a C++ exception if it is called on systems prior 
/// to Windows Vista. It is not appropriate to use this function to determine 
/// whether a process is run as administartor.
/// </summary>
/// <returns>
/// Returns true if the process is elevated. Returns false if it is not.
/// </returns>
/// <exception cref="System.ComponentModel.Win32Exception">
/// When any native Windows API call fails, the function throws a Win32Exception 
/// with the last error code.
/// </exception>
/// <remarks>
/// TOKEN_INFORMATION_CLASS provides TokenElevationType to check the elevation 
/// type (TokenElevationTypeDefault / TokenElevationTypeLimited / 
/// TokenElevationTypeFull) of the process. It is different from TokenElevation 
/// in that, when UAC is turned off, elevation type always returns 
/// TokenElevationTypeDefault even though the process is elevated (Integrity 
/// Level == High). In other words, it is not safe to say if the process is 
/// elevated based on elevation type. Instead, we should use TokenElevation. 
/// </remarks>
internal bool IsProcessElevated()
{
    bool fIsElevated = false;
    SafeTokenHandle hToken = null;
    int cbTokenElevation = 0;
    IntPtr pTokenElevation = IntPtr.Zero;
 
    try
    {
        // Open the access token of the current process with TOKEN_QUERY.
        if (!NativeMethod.OpenProcessToken(Process.GetCurrentProcess().Handle,
            NativeMethod.TOKEN_QUERY, out hToken))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
 
        // Allocate a buffer for the elevation information.
        cbTokenElevation = Marshal.SizeOf(typeof(TOKEN_ELEVATION));
        pTokenElevation = Marshal.AllocHGlobal(cbTokenElevation);
        if (pTokenElevation == IntPtr.Zero)
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
 
        // Retrieve token elevation information.
        if (!NativeMethod.GetTokenInformation(hToken, 
            TOKEN_INFORMATION_CLASS.TokenElevation, pTokenElevation,
            cbTokenElevation, out cbTokenElevation))
        {
            // When the process is run on operating systems prior to Windows 
            // Vista, GetTokenInformation returns false with the error code 
            // ERROR_INVALID_PARAMETER because TokenElevation is not supported 
            // on those operating systems.
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
 
        // Marshal the TOKEN_ELEVATION struct from native to .NET object.
        TOKEN_ELEVATION elevation = (TOKEN_ELEVATION)Marshal.PtrToStructure(
            pTokenElevation, typeof(TOKEN_ELEVATION));
 
        // TOKEN_ELEVATION.TokenIsElevated is a non-zero value if the token 
        // has elevated privileges; otherwise, a zero value.
        fIsElevated = (elevation.TokenIsElevated != 0);
    }
    finally
    {
        // Centralized cleanup for all allocated resources. 
        if (hToken != null)
        {
            hToken.Close();
            hToken = null;
        }
        if (pTokenElevation != IntPtr.Zero)
        {
            Marshal.FreeHGlobal(pTokenElevation);
            pTokenElevation = IntPtr.Zero;
            cbTokenElevation = 0;
        }
    }
    return fIsElevated;
}


GetProcessIntegrityLevel

Функция возвращает integrity level процесса (Windows Vista и выше).
Для обычных процессов будет medium level, для запущенных с админскими
правами - high level.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/// <summary>
/// The function gets the integrity level of the current process. Integrity 
/// level is only available on Windows Vista and newer operating systems, thus 
/// GetProcessIntegrityLevel throws a C++ exception if it is called on systems 
/// prior to Windows Vista.
/// </summary>
/// <returns>
/// Returns the integrity level of the current process. It is usually one of 
/// these values:
/// 
///    SECURITY_MANDATORY_UNTRUSTED_RID - means untrusted level. It is used 
///    by processes started by the Anonymous group. Blocks most write access.
///    (SID: S-1-16-0x0)
///    
///    SECURITY_MANDATORY_LOW_RID - means low integrity level. It is used by
///    Protected Mode Internet Explorer. Blocks write acess to most objects 
///    (such as files and registry keys) on the system. (SID: S-1-16-0x1000)
/// 
///    SECURITY_MANDATORY_MEDIUM_RID - means medium integrity level. It is 
///    used by normal applications being launched while UAC is enabled. 
///    (SID: S-1-16-0x2000)
///    
///    SECURITY_MANDATORY_HIGH_RID - means high integrity level. It is used 
///    by administrative applications launched through elevation when UAC is 
///    enabled, or normal applications if UAC is disabled and the user is an 
///    administrator. (SID: S-1-16-0x3000)
///    
///    SECURITY_MANDATORY_SYSTEM_RID - means system integrity level. It is 
///    used by services and other system-level applications (such as Wininit, 
///    Winlogon, Smss, etc.)  (SID: S-1-16-0x4000)
/// 
/// </returns>
/// <exception cref="System.ComponentModel.Win32Exception">
/// When any native Windows API call fails, the function throws a Win32Exception 
/// with the last error code.
/// </exception>
internal int GetProcessIntegrityLevel()
{
    int IL = -1;
    SafeTokenHandle hToken = null;
    int cbTokenIL = 0;
    IntPtr pTokenIL = IntPtr.Zero;
 
    try
    {
        // Open the access token of the current process with TOKEN_QUERY.
        if (!NativeMethod.OpenProcessToken(Process.GetCurrentProcess().Handle,
            NativeMethod.TOKEN_QUERY, out hToken))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
 
        // Then we must query the size of the integrity level information 
        // associated with the token. Note that we expect GetTokenInformation 
        // to return false with the ERROR_INSUFFICIENT_BUFFER error code 
        // because we've given it a null buffer. On exit cbTokenIL will tell 
        // the size of the group information.
        if (!NativeMethod.GetTokenInformation(hToken,
            TOKEN_INFORMATION_CLASS.TokenIntegrityLevel, IntPtr.Zero, 0,
            out cbTokenIL))
        {
            int error = Marshal.GetLastWin32Error();
            if (error != NativeMethod.ERROR_INSUFFICIENT_BUFFER)
            {
                // When the process is run on operating systems prior to 
                // Windows Vista, GetTokenInformation returns false with the 
                // ERROR_INVALID_PARAMETER error code because 
                // TokenIntegrityLevel is not supported on those OS's.
                throw new Win32Exception(error);
            }
        }
 
        // Now we allocate a buffer for the integrity level information.
        pTokenIL = Marshal.AllocHGlobal(cbTokenIL);
        if (pTokenIL == IntPtr.Zero)
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
 
        // Now we ask for the integrity level information again. This may fail 
        // if an administrator has added this account to an additional group 
        // between our first call to GetTokenInformation and this one.
        if (!NativeMethod.GetTokenInformation(hToken,
            TOKEN_INFORMATION_CLASS.TokenIntegrityLevel, pTokenIL, cbTokenIL,
            out cbTokenIL))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
 
        // Marshal the TOKEN_MANDATORY_LABEL struct from native to .NET object.
        TOKEN_MANDATORY_LABEL tokenIL = (TOKEN_MANDATORY_LABEL)
        Marshal.PtrToStructure(pTokenIL, typeof(TOKEN_MANDATORY_LABEL));
 
        // Integrity Level SIDs are in the form of S-1-16-0xXXXX. (e.g. 
        // S-1-16-0x1000 stands for low integrity level SID). There is one 
        // and only one subauthority.
        IntPtr pIL = NativeMethod.GetSidSubAuthority(tokenIL.Label.Sid, 0);
        IL = Marshal.ReadInt32(pIL);
    }
    finally
    {
        // Centralized cleanup for all allocated resources. 
        if (hToken != null)
        {
            hToken.Close();
            hToken = null;
        }
        if (pTokenIL != IntPtr.Zero)
        {
            Marshal.FreeHGlobal(pTokenIL);
            pTokenIL = IntPtr.Zero;
            cbTokenIL = 0;
        }
    }
 
    return IL;
}
4
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.06.2014, 15:32 11
Цитата Сообщение от Убежденный Посмотреть сообщение
Что есть "current Windows user" в данном случае ? Залогиненный в сессии
процесса юзер или юзер, в контексте которого выполняется данный процесс/поток ?
Если первое, тогда функция всегда возвращала бы True для администратора, даже
если процесс не имеет админского SID-а (а следовательно, и прав на запись в
HKLM и системные папки). Но проблема в том, что у меня на "голой" Windows 7 с
включенным UAC она стабильно возвращает False, если только не запускать
программу от имени администратора, тогда True.
ну вот у меня как раз поведение по первому случаю, например.

Вот нашел тему, о которой говорил:
Запуск программы с правами администратора
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.06.2014, 17:41 12
Цитата Сообщение от Psilon Посмотреть сообщение
ну вот у меня как раз поведение по первому случаю, например.
Psilon, я сейчас еще раз проверил этот код (IsRunAsAdmin) на девственно
чистой Windows 7 (MSDN-образ) на трех разных учетках - администратор (Admin),
встроенный администратор (Builtin Admin) и обычный пользователь (Standard User),
первый раз с включенным UAC, второй с выключенным, после перезагрузки системы.
Еще проверил работу функции с разными настройками "Admin Approval Mode" (AAM)
для встроенных администраторов (ведь эта учетка по умолчанию скрыта только в
клиентских редакциях Windows, а на серверных она является основной). Во всех
случаях функция отработала корректно, вернув True и False там, где надо.

Результаты:

Код
UAC включен, AAM для встроенных админов выключен (настройки по умолчанию)

    Обычный запуск exe:
    
        Admin         - False
        Builtin Admin - True
        Standard User - False
    
    Запуск от имени администратора:
    
        Admin         - True
        Builtin Admin - True
        Standard User - True (от имени Admin или Builtin Admin)

UAC включен, AAM для встроенных админов включен

    Обычный запуск exe:
    
        Admin         - False
        Builtin Admin - False
        Standard User - False
    
    Запуск от имени администратора:
    
        Admin         - True
        Builtin Admin - True
        Standard User - True (от имени Admin или Builtin Admin)

UAC выключен (ползунок в самый низ), AAM не играет роли

    Обычный запуск exe:

        Admin         - True
        Builtin Admin - True
        Standard User - False
    
    Запуск от имени администратора:
    
        Admin         - True
        Builtin Admin - True
        Standard User - False (без разницы от кого).
Сразу после проверки прав админа я вставил создание ключа реестра в
разделе HKLM\SYSTEM. Нигде не было такого, чтобы функция вернула True,
но ключ не создался, или наоборот.

Цитата Сообщение от Psilon Посмотреть сообщение
Вот нашел тему, о которой говорил: (ссылка)
В той теме так и не пришли к определенному решению.
Более того, проверять права администратора через проверку типа токена
(elevationResult == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull
Запуск программы с правами администратора)
неверно, потому что если отключить UAC (а многие юзеры это делают), у
администраторов останется один токен - default - вместо full и limited.
И код будет ошибочно возвращать "IsAdmin = False".

То же самое, безотносительно настроек UAC, справедливо для встроенной
администраторской учетки, по причинам, описанным выше (AAM для нее выключен).

И повторюсь - код IsRunAsAdmin предоставлен самой Microsoft, и нет никаких
оснований ему не доверять (хотя и на солнце бывают пятна).
4
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
11.05.2016, 09:55 13
Цитата Сообщение от Убежденный Посмотреть сообщение
В WinAPI я всегда делал это через CheckTokenMembership с админским
SID-ом, т.е. S-1-5-32-544, это корректно работает на XP-Vista-7-8-8.1
Можно ведь кстати проще делать - SHTestTokenMembership(NULL, DOMAIN_ALIAS_RID_ADMINS). Дебажил данную функцию, в ней как раз и вызывается CheckTokenMembership с SID'ом S-1-5-32-544.
1
11.05.2016, 09:55
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.05.2016, 09:55
Помогаю со студенческими работами здесь

Проверка на запуск программы от имени Администратора
Как проверить в программе на то, если ли у неё права Администратора?

Проверка прав пользователя на запись файла
Как быстро проверить, что у пользователя есть доступ на запись файла? Конечно можно файл пытаться...

Проверка прав и атрибутов доступа к файлу, установка их
Товарищи, вопрос таков: Имеется програмка, считывающая данные с одной папки и генерирующая в...

Проверка наличия прав администратора
Мне необходимо сделать проверку наличия прав администратора в программе. ВАЖНО! Мне нужно, чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Какой язык программировани­я лучший для разработки нейронных сетей
InfoMaster 20.01.2025
В современном мире технологий искусственные нейронные сети становятся неотъемлемой частью множества инновационных решений, от распознавания речи до автоматического управления транспортными. . .
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
Как переместить последние коммиты в новую ветку (branch) в Git
InfoMaster 20.01.2025
При работе над проектом часто возникают ситуации, когда необходимо изолировать определенные изменения от основной линии разработки. Это может быть связано с экспериментальными функциями, исправлением. . .
Как вернуть результат из асинхронной функции в JavaScript
InfoMaster 20.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока выполнения программы. В. . .
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетов началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые прототипы,. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru