Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
1 / 1 / 1
Регистрация: 26.03.2016
Сообщений: 67

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

26.08.2017, 22:02. Показов 3793. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, каким образом можно определить, есть ли права администратора у какого-либо чужого! процесса?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.08.2017, 22:02
Ответы с готовыми решениями:

Проверка прав администратора
Для работы моего приложения нужны права администратора, как проверить с какими правами запустилась программа

Получить командную строку (CommandLine|arguments) процесса без прав администратора
Задача: Необходимо получить параметры запуска всех процессов. Если получать данные через Process.GetProcesses() и в нем...

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

9
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
27.08.2017, 23:43
Лучший ответ Сообщение было отмечено Zrefer как решение

Решение

Мда... в общем, основываясь на Check if another process has admin privileges in .NET копипастя из http://www.pinvoke.net и чуть скоректировав из Rob Shearman : advapi32: Fix CheckTokenMembership test on Windows. получилось нечто такое.

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Collections.Generic;
 
namespace ConsoleApp2
{
    public class DarkMagikApi
    {
        const UInt32 TOKEN_DUPLICATE = 0x0002;
        const UInt32 TOKEN_QUERY = 0x0008;
 
        [Flags]
        enum ProcessAccessFlags : uint
        {
            All = 0x001F0FFF,
            Terminate = 0x00000001,
            CreateThread = 0x00000002,
            VirtualMemoryOperation = 0x00000008,
            VirtualMemoryRead = 0x00000010,
            VirtualMemoryWrite = 0x00000020,
            DuplicateHandle = 0x00000040,
            CreateProcess = 0x000000080,
            SetQuota = 0x00000100,
            SetInformation = 0x00000200,
            QueryInformation = 0x00000400,
            QueryLimitedInformation = 0x00001000,
            Synchronize = 0x00100000
        }
        
        [Flags]
        enum SECURITY_IMPERSONATION_LEVEL
        {
            SecurityAnonymous,
            SecurityIdentification,
            SecurityImpersonation,
            SecurityDelegation
        }
 
        [Flags]
        enum WELL_KNOWN_SID_TYPE
        {
            WinNullSid = 0,
            WinWorldSid = 1,
            WinLocalSid = 2,
            WinCreatorOwnerSid = 3,
            WinCreatorGroupSid = 4,
            WinCreatorOwnerServerSid = 5,
            WinCreatorGroupServerSid = 6,
            WinNtAuthoritySid = 7,
            WinDialupSid = 8,
            WinNetworkSid = 9,
            WinBatchSid = 10,
            WinInteractiveSid = 11,
            WinServiceSid = 12,
            WinAnonymousSid = 13,
            WinProxySid = 14,
            WinEnterpriseControllersSid = 15,
            WinSelfSid = 16,
            WinAuthenticatedUserSid = 17,
            WinRestrictedCodeSid = 18,
            WinTerminalServerSid = 19,
            WinRemoteLogonIdSid = 20,
            WinLogonIdsSid = 21,
            WinLocalSystemSid = 22,
            WinLocalServiceSid = 23,
            WinNetworkServiceSid = 24,
            WinBuiltinDomainSid = 25,
            WinBuiltinAdministratorsSid = 26,
            WinBuiltinUsersSid = 27,
            WinBuiltinGuestsSid = 28,
            WinBuiltinPowerUsersSid = 29,
            WinBuiltinAccountOperatorsSid = 30,
            WinBuiltinSystemOperatorsSid = 31,
            WinBuiltinPrintOperatorsSid = 32,
            WinBuiltinBackupOperatorsSid = 33,
            WinBuiltinReplicatorSid = 34,
            WinBuiltinPreWindows2000CompatibleAccessSid = 35,
            WinBuiltinRemoteDesktopUsersSid = 36,
            WinBuiltinNetworkConfigurationOperatorsSid = 37,
            WinAccountAdministratorSid = 38,
            WinAccountGuestSid = 39,
            WinAccountKrbtgtSid = 40,
            WinAccountDomainAdminsSid = 41,
            WinAccountDomainUsersSid = 42,
            WinAccountDomainGuestsSid = 43,
            WinAccountComputersSid = 44,
            WinAccountControllersSid = 45,
            WinAccountCertAdminsSid = 46,
            WinAccountSchemaAdminsSid = 47,
            WinAccountEnterpriseAdminsSid = 48,
            WinAccountPolicyAdminsSid = 49,
            WinAccountRasAndIasServersSid = 50,
            WinNTLMAuthenticationSid = 51,
            WinDigestAuthenticationSid = 52,
            WinSChannelAuthenticationSid = 53,
            WinThisOrganizationSid = 54,
            WinOtherOrganizationSid = 55,
            WinBuiltinIncomingForestTrustBuildersSid = 56,
            WinBuiltinPerfMonitoringUsersSid = 57,
            WinBuiltinPerfLoggingUsersSid = 58,
            WinBuiltinAuthorizationAccessSid = 59,
            WinBuiltinTerminalServerLicenseServersSid = 60,
        }
 
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool CheckTokenMembership(IntPtr TokenHandle, IntPtr SidToCheck, out bool IsMember);
 
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool CreateWellKnownSid(WELL_KNOWN_SID_TYPE WellKnownSidType, IntPtr DomainSid, IntPtr pSid, ref uint cbSid);
 
        [DllImport("advapi32.dll", SetLastError = true)]
        extern static bool DuplicateToken(IntPtr hExistingToken, SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, out IntPtr phNewToken);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr OpenProcess(ProcessAccessFlags processAccess, bool bInheritHandle, int processId);
        
        [DllImport("advapi32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);
        
        public static IEnumerable<Process> GetAdminProcesses()
        {
            var ret = false;
            foreach (var proc in Process.GetProcesses())
            {
                if (proc == null) continue;
                IntPtr processHandle = OpenProcess(ProcessAccessFlags.QueryInformation, false, proc.Id);
                if (processHandle == IntPtr.Zero) continue;
                ret = OpenProcessToken(processHandle, TOKEN_DUPLICATE | TOKEN_QUERY, out IntPtr tokenHandle);
                if (!ret) continue;
                ret = DuplicateToken(tokenHandle, SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, out IntPtr newToken);
                if (!ret) continue;
                uint cbSid = 0;
                var pSid = IntPtr.Zero;
                var wellKnownSidType = WELL_KNOWN_SID_TYPE.WinBuiltinAdministratorsSid;
                CreateWellKnownSid(wellKnownSidType, IntPtr.Zero, pSid, ref cbSid);
                pSid = Marshal.AllocCoTaskMem(Convert.ToInt32(cbSid));
                ret = CreateWellKnownSid(wellKnownSidType, IntPtr.Zero, pSid, ref cbSid);
                if (!ret) continue;
                ret = CheckTokenMembership(newToken, pSid, out bool isMember);
                if (!ret) continue;
                if (isMember)
                    yield return proc;
            }
        }
    }
}
пример вывода на консоль
C#
1
2
3
4
5
6
7
static void Main(string[] args)
        {
            foreach (var proc in DarkMagikApi.GetAdminProcesses())
                Console.WriteLine(proc.ProcessName);
 
            Console.ReadKey();
        }
p.s. подозреваю что даный код имеет с десяток ошибок и ньюансов, но в winapi (или что это такое) я на самом деле полный ноль.

Добавлено через 2 минуты
p.p.s. все enum по идеи можно заменить на int c соответствующими значениями
1
1 / 1 / 1
Регистрация: 26.03.2016
Сообщений: 67
21.09.2017, 21:06  [ТС]
Wolfdp, Увы, но не работает, выдаёт всего 1 процесс и тот без прав админа

Добавлено через 49 минут
Wolfdp, Упс, дико извиняюсь, ступил, смотрел процессы из под процесса без прав администратора, всё работает, правда показывает не все процессы, но тех, что есть хватает, спасибо
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.09.2017, 21:08
Цитата Сообщение от Zrefer Посмотреть сообщение
каким образом можно определить, есть ли права администратора у какого-либо чужого! процесса?
Код не приведу, т.к. C# владею плохо, но могу описать примерную последовательность действий
(в терминах Win32 API).

Сначала нужно открыть нужный процесс: OpenProcess + PROCESS_QUERY_INFORMATION и запросить его
access token (токен доступа или маркер доступа, как его называют): OpenProcessToken + TOKEN_QUERY.
Этот токен содержит список пользователей и групп (SID-ов) процесса, его привилегии, и еще много
всякой информации. Далее нужно создать SID группы "Администраторы" (S-1-5-32-544) и проверить,
включает ли токен данный SID. Это можно сделать либо функцией CheckTokenMembership, либо самому
запросить список групп (GetTokenInformation + TokenGroups) и поискать данный SID среди них (отбрасывая
элементы, у которых не установлен флаг SE_GROUP_ENABLED или SE_GROUP_ENABLED_BY_DEFAULT).
SID можно создать по-разному, см. например CreateWellKnownSid или AllocateAndInitializeSid.

Хэндлы процесса и токена потом следует закрыть - CloseHandle.

Кстати, перед вызовом OpenProcess полезно попробовать включить привилегию отладки -
SeDebugPrivilege, она позволяет открывать почти любые процессы в обход проверок доступа.

Наверняка в .NET есть готовые классы под такую задачу и она решается в пять строчек кода...

Собственно, Wolfdp уже привел код, там только утечки подправить (не хватает
CloseHandle) и все будет ок...
2
1 / 1 / 1
Регистрация: 26.03.2016
Сообщений: 67
21.09.2017, 21:13  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Наверняка в .NET есть готовые классы под такую задачу и она решается в пять строчек кода...
Увы, но похоже, что нет

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
Собственно, Wolfdp уже привел код, там только утечки подправить
Да, его код рабочий, вот, как раз, корректирую
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.09.2017, 21:23
Цитата Сообщение от Zrefer Посмотреть сообщение
корректирую
Кстати, я уверен, что вызов DuplicateToken там лишний.
И, соответственно, OpenProcessToken можно вызывать без флага TOKEN_DUPLICATE.
0
1 / 1 / 1
Регистрация: 26.03.2016
Сообщений: 67
21.09.2017, 22:03  [ТС]
Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
Кстати, перед вызовом OpenProcess полезно попробовать включить привилегию отладки -
SeDebugPrivilege, она позволяет открывать почти любые процессы в обход проверок доступа.
Не можете подсказать, как это реализовать?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.09.2017, 22:52
Можно взять за основу вот этот код и переделать его под PInvoke:

Enabling and Disabling Privileges in C++
https://msdn.microsoft.com/ru-... 85%29.aspx

Кстати, хорошей практикой считается включать привилегию не для всего процесса, а
только для потока и только на то время, пока она нужна. Для этого достаточно немного
модифицировать данную функцию, чтобы она использовала токен потока, а не процесса
(а токен получить можно у ImpersonateSelf, см. также RevertToSelf).
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
22.09.2017, 08:11
Цитата Сообщение от Убежденный Посмотреть сообщение
Кстати, я уверен, что вызов DuplicateToken там лишний.
Я писал по сути методом тыка и копипаста, проверяя статус открытого Notepad. Без дубликации токена метод CheckTokenMembership возращал какую-то ошибку (номер не помню). И положа руку на сердце, я поооолный нуб в этом вопросе, просто интересно было решить эту задачу.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.09.2017, 08:54
Цитата Сообщение от Wolfdp Посмотреть сообщение
Без дубликации токена метод CheckTokenMembership возращал какую-то ошибку (номер не помню).
Да, все верно, она возвращает 0x51D: "An attempt has been made to operate on an impersonation
token by a thread that is not currently impersonating a client". А в описании функции сказано:
TokenHandle [in, optional]

A handle to an access token. The handle must have TOKEN_QUERY access to the token. The token must be an impersonation token.
Так что вызов DuplicateToken(Ex) здесь все-таки нужен.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.09.2017, 08:54
Помогаю со студенческими работами здесь

Проверка прав администратора пользователя
Столкнулся с необходимостью проверки прав администратора в приложении. Оказалось, что в ОС выше Vista права администратора приложению...

Проверка наличия прав администратора Windows vbs
Всем привет. Пишу скрипт для изменения реестра. Так вот чтобы изменить реестр на уровне локальной машины, хочу сделать проверку на...

Запуск программы без прав администратора скриптом, запущенным с правами администратора
Добрый день. Запускаю скрипт с правами администратора. Тот в свою очередь запускает программу, как я понимаю, тоже с правами админа....

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

Завершение процесса при обнаружении другого процесса на .bat или .vbs
Будет всегда висеть в системе не закрываясь и смотреть при открытии даже одной из этих программ notepad.exe aimp.exe tc.exe будет...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru