Как выполнить функцию API от имени администратора?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Как выполнить функцию API от имени администратора?

Сообщение aleksmir » 24.01.2010 (Вс) 20:06

У меня есть библиотека admin.dll (я её сам написал в VB5). Она ActiveX.
И есть файл start.exe (к примеру), который пользуется этой библиотекой.

Чтобы не уложнять жизнь обычным юзерам моя программа может копироваться с одного ПК на другой без переустановки.
Это реализовывается таким образом, что сразу после запуска start.exe внутри него выполняется такой код:
Код: Выделить всё
Private Declare Function Reg_Admin Lib "admin.dll" Alias "DllRegisterServer" () As Long
Sub Main()
Call Reg_Admin
...
End Sub


В Windows XP это работает нормально.
Но в Windows 7 отказывается работать. И даже в ручную в Windows 7 при запуске из командной строки
Код: Выделить всё
regsvr32.exe admin.dll
выдаёт такое сообщение: "...не удалось выполнить вызов DllRegisterServer, код ошибки: 0x80004005"

Помогло такое:
1. В Windows 7 открываю ПУСК -> ВСЕ ПРОГРАММЫ -> СТАНДАРТНЫЕ -> Командная строка -> Нажимаю правую кнопку мыши -> Выбираю запустить от имени Администратора.
2. Набираю из командной строки: regsvr32.exe admin.dll и регистрация проходит отлично.

Вопрос: как теперь это реализовать в коде программы?

P.S.: пользователь в Windows 7 имеет права администратора
P.S.2: пробовал в коде программы перед вызовом Reg_Admin включить разрешение работы с системными процессами с привелегией "SeDebugPrivilege", но это не помогло.
P.S.3: странно, что стандартная библиотека VB5 регистрируется в Windows 7 без всяких дополнительных прав, т.е. команда regsvr32.dll msvbvm50.dll работает без проблем, а команда regsvr32.dll admin.dll не работает.
P.S.4: под Vist-ой ещё не проверял, но подозреваю, что там будет происходить тоже самое.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как выполнить функцию API от имени администратора?

Сообщение Хакер » 24.01.2010 (Вс) 21:41

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

О боже. Усложнять жизнь обычным юзерам. Запуск setup.exe так сложен, что его могут осилить только доктора философии в области компьютерных наук. Ну и бред же.

пробовал в коде программы перед вызовом Reg_Admin включить разрешение работы с системными процессами с привелегией "SeDebugPrivilege", но это не помогло.

Логика верная, но причём тут SeDebugPrivilege? Причём тут отладка, возможность копаться в памяти чужих процессов? Разве не логично, что запросив разрешение на право отладки чужих процесов, тебе отказывают в записи в реестр? По-моему, это логично и не удивительно. Запрашивай правильную привилегию, если такая есть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как выполнить функцию API от имени администратора?

Сообщение Twister » 25.01.2010 (Пн) 7:32

Судя по всему тут требуется SeTakeOwnershipPrivilege привилегия:
http://msdn.microsoft.com/en-us/library/ms724878(VS.85).aspx писал(а):If an administrator needs access to the key, the solution is to enable the SE_TAKE_OWNERSHIP_NAME privilege and open the registry key with WRITE_OWNER access
А я все практикую лечение травами...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Как выполнить функцию API от имени администратора?

Сообщение ANDLL » 25.01.2010 (Пн) 11:58

Если какаято привелегия и нужна, процесс ее не сможет получить, потому что у него нет на нее прав.
Есть два способа запускать код под элевацией.
В данных условиях задачи остается только одинспособ - добавить приложению манифест, требующий элевации(гугл)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как выполнить функцию API от имени администратора?

Сообщение Twister » 25.01.2010 (Пн) 12:36

Если какаято привелегия и нужна, процесс ее не сможет получить, потому что у него нет на нее прав.
Нет-нет. Получить он ее сможет, ибо
aleksmir писал(а):P.S.: пользователь в Windows 7 имеет права администратора
А я все практикую лечение травами...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Как выполнить функцию API от имени администратора?

Сообщение ANDLL » 25.01.2010 (Пн) 13:31

Нет нет, не сможет потому что
P.S.: пользователь в Windows 7 имеет права администратора

Ибо если пораскинуть, то коль скоро у него все фейлится, значит UAC включен.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как выполнить функцию API от имени администратора?

Сообщение iGrok » 25.01.2010 (Пн) 15:32

Посколько права требуются только на время регистрации библиотеки, я вот не вижу смысла в манифесте.
Почему не сделать так?
viewtopic.php?f=51&t=38664&p=6711985#p6711985
label:
cli
jmp label

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как выполнить функцию API от имени администратора?

Сообщение Twister » 25.01.2010 (Пн) 17:31

Ибо если пораскинуть, то коль скоро у него все фейлится, значит UAC включен.
Хм... Ну вот тут ничего сказать не могу - я это гуано сразу отключаю. Вполне может быть и так, что UAC не даст администратору возможности добавить Se-привилегию. Домой доберусь - проверю.
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как выполнить функцию API от имени администратора?

Сообщение alibek » 25.01.2010 (Пн) 17:35

Twister писал(а):Вполне может быть и так, что UAC не даст администратору возможности добавить Se-привилегию. Домой доберусь - проверю.

После слова "администратору" пропущено "без подтверждения".
А без манифеста запроса подтверждения может и не быть.
Lasciate ogni speranza, voi ch'entrate.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Как выполнить функцию API от имени администратора?

Сообщение ANDLL » 25.01.2010 (Пн) 17:44

Алибёк, тут ты не совсем прав. Еще есть elevated com objects, хотя они тут не в тему. Но для них вроде как в манифесте ничего не изменяется.

Кстати, давно хотел спросить, а манифест дейсвтует только на исполняемые файлы, или может быть и у dll свой манифест?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как выполнить функцию API от имени администратора?

Сообщение Twister » 25.01.2010 (Пн) 19:05

После слова "администратору" пропущено "без подтверждения".
А без манифеста запроса подтверждения может и не быть.
Угу, совершенно верно. Написал маленькую прогу, без манифеста. Запускал под админом. Без UAC спокойно добавляет ключ в HKLM\Software и аджастит привилегию SeTakeOwnershipPrivilege. Со включенным UAC не делает ни того, ни другого, при чем никаких сообщений не отображает.

По теме: имхо, самым правильным решением все-таки было добавить манифест в программу и пытаться получить SeTakeOwnershipPrivilege.
А я все практикую лечение травами...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как выполнить функцию API от имени администратора?

Сообщение Antonariy » 26.01.2010 (Вт) 14:26

Twister писал(а):Со включенным UAC не делает ни того, ни другого, при чем никаких сообщений не отображает.
Истинно так, наблюдал это на сервере 2008.
Лучший способ понять что-то самому — объяснить это другому.

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Как выполнить функцию API от имени администратора?

Сообщение aleksmir » 26.01.2010 (Вт) 22:16

Twister писал(а):Судя по всему тут требуется привилегия:SeTakeOwnershipPrivilege


Спасибо, Twister за ссылку на список привилегий. Познавательно. Я про это не знал раньше.
Попробовал все привилегии, в том числе и SeTakeOwnershipPrivilege (см. прикреплённый файл для тестирования).

Не помогло :(
При установки любой привилегии библиотека в Windows 7 не регистрируется, а в XP регистрируется в большинстве случаев (просто некоторые привилегии в XP не действуют).
Вложения
testpriv.rar
(861.95 Кб) Скачиваний: 113

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как выполнить функцию API от имени администратора?

Сообщение iGrok » 26.01.2010 (Вт) 22:38

А мой вариант не работает? Или не подходит по идеологическим соображениям?
label:
cli
jmp label

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Как выполнить функцию API от имени администратора?

Сообщение aleksmir » 26.01.2010 (Вт) 22:45

Twister писал(а):самым правильным решением все-таки было добавить манифест в программу


Я так прочитал примеры про манифест в VB6. Там везде примеры о том, что этот манифест в XP включается контролы, как у XP, а в Windows 98 контролы как в Windows 98. А у меня другая ситуация. А где взять манифест для моей ситуации или он для всех случаев одинаковый? И как правильно его добавить... может быть уже есть опыт у кого-нибудь?

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Как выполнить функцию API от имени администратора?

Сообщение aleksmir » 26.01.2010 (Вт) 22:49

iGrok писал(а):А мой вариант не работает? Или не подходит по идеологическим соображениям?


Я по-очереди все варианты пробую :) Просто перед этим предложили манифест использовать.
Вполне возможно, что твой самый лучший! Я его отложил на потом из предположения, что у тебя в примере немного другая ситуация - там рассматривается ситуация с редактированием реестра, а у меня проблема с запуском функции API из библиотеки.

И вторая причина - не хотелось бы лишних окон и запусков второй копии программы. Предположил, что с манифестом программа будет запускаться без дополнительных сообщений.

К тому же интересно - почему msvbvm50.dll в Windows 7 регистрируется без проблем, а моя admin.dll только через запуск от имени администратора?
Может быть в admin.dll можно что-то такое добавить (какой-будь файл лицензии или сертификат какой-нибудь), чтобы он регистрировался также без проблем как msvbvm50.dll ?
Последний раз редактировалось aleksmir 26.01.2010 (Вт) 23:10, всего редактировалось 2 раз(а).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как выполнить функцию API от имени администратора?

Сообщение Хакер » 26.01.2010 (Вт) 23:07

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Как выполнить функцию API от имени администратора?

Сообщение aleksmir » 24.02.2010 (Ср) 18:24

Я чего-то с этим манифестом совсем туплю. Попробовал создать файл name.exe.manifest - не срабатывает всё-равно.

Может у кого-нибудь завалялся хоть какой-нибудь реально работающий пример?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как выполнить функцию API от имени администратора?

Сообщение jangle » 24.02.2010 (Ср) 20:57

aleksmir писал(а):К тому же интересно - почему msvbvm50.dll в Windows 7 регистрируется без проблем, а моя admin.dll только через запуск от имени администратора?


Начиная с Win2000 msvbvm50/60.dll это системные библиотеки входящие в состав ОС

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Как выполнить функцию API от имени администратора?

Сообщение BV » 25.02.2010 (Чт) 11:25

На месте автора, я бы не страдал ерундой, а создал бы простенькую установку, на том же Inno Setup, с манифестом, запрашивающим права администратора.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Как выполнить функцию API от имени администратора?

Сообщение aleksmir » 27.03.2010 (Сб) 4:33

BV писал(а):На месте автора, я бы не страдал ерундой, а создал бы простенькую установку, на том же Inno Setup, с манифестом, запрашивающим права администратора.


Мне вообще эти ActiveX нахрен не нужны.

Это мои же библиотеки, которые идут вместе с программой только для того чтобы поделить программу на модули, чтобы exe-файл компилировался быстрее и был меньше размером.

Почему в VB5 не реализовали использование обычных статических DLL, вообще не понятно.

С этими ActiveX столько е...ни, которую Microsoft сама себе придумала, а теперь сама же их и блокирует.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как выполнить функцию API от имени администратора?

Сообщение Хакер » 27.03.2010 (Сб) 7:02

aleksmir писал(а):Почему в VB5 не реализовали использование обычных статических DLL, вообще не понятно.

Потому что это не безопасно. Никто не гарантирует бинарную совместимость используемого и использующего.

С этими ActiveX столько е...ни, которую Microsoft сама себе придумала, а теперь сама же их и блокирует.

У нас мат запрещён, включая криптованный. Замечание.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Как выполнить функцию API от имени администратора?

Сообщение aleksmir » 27.03.2010 (Сб) 16:03

Хакер писал(а):Потому что это не безопасно. Никто не гарантирует бинарную совместимость используемого и использующего.


Да они и так несовместимые. Всё-равно их перекомпилировать приходится каждый раз, несмотря на включенную проверку бинарной совместимости. Какой-нибудь нет нет да сглючит потом у клиента. Поэтому и приходится все библиотеки по-новой перекомпилировать, чтобы не краснеть потом у заказчика.
А вот статические DLL как раз бы подошли для этого случая. За совместимостью уж лучше бы я следил, а не Microsoft.

Хакер писал(а):У нас мат запрещён, включая криптованный. Замечание.


Хорошо не буду.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Как выполнить функцию API от имени администратора?

Сообщение Денис » 27.03.2010 (Сб) 21:41

aleksmir писал(а):А вот статические DLL как раз бы подошли для этого случая.

1. Делать статические библиотеки на PowerBasic, Delphi или С, а в VB декларировать функции из них.
2. Между прочим, админ Хакер, выписавший Вам замечание, написал как-то продукт FireNativeDLL, который может Вам помочь писать библиотеки прям на VB.

Но вообще, хочу Вам напомнить, что через ActiveX Вы сохраняете не просто функции и процедуры, а классы объектов! А это уже совершенно иной уровень абстракции. Если грамотно этим механизмом пользоваться, то можно контролировать и проблемы совместимости и решать еще кучу задач, нереальных в функциональном программировании.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList  
cron