Получение привилегий в Vista

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Получение привилегий в Vista

Сообщение iGrok » 09.02.2009 (Пн) 23:57

ANDLL писал(а):Да? Ну тогда ладно. Думал это предлагалось как ответ на поставленный (вверху) вопрос...

Нет конечно.=)
Мой способ - ответ на вопрос "Как сделать элевацию по требованию для какого-то определённого действия."
И мне казалось, что это понятно из цитаты, которой я сопровождал пост со способом. =)

Кстати, если заканчивать оффтоп, и продолжать тему - в Висте для автозагрузки лучше применять ветки "HKEY_CURRENT_USER". Для помещения ключей в них элевации не требуется, но действовать это будет только для текущего юзера.
Если уж очень хочется именно в HKEY_LOCAL_MACHINE, или нужно сделать для всех и сразу - тогда можно использовать метод, предложенный выше.

В аттаче пример его применения с небольшими комментами. Проверил на Висте. Работает. =)
Elevation.rar
Self-Elevation
(19.1 Кб) Скачиваний: 466
label:
cli
jmp label

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Получение привилегий в Vista

Сообщение tyomitch » 10.02.2009 (Вт) 0:36

looking писал(а):А добавлять в Планироващик заданий (так он по-русски называется?) программно - та ещё задача!

Никакой проблемы, кстати.
Там довольно удобный COM-интерфейс.
Изображение

looking
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 01.02.2009 (Вс) 16:54

Re: Получение привилегий в Vista

Сообщение looking » 14.02.2009 (Сб) 11:37

tyomitch писал(а):
looking писал(а):А добавлять в Планироващик заданий (так он по-русски называется?) программно - та ещё задача!

Никакой проблемы, кстати.
Там довольно удобный COM-интерфейс.

Я знаю несколько человек, которые отключают планировщик по разным причинам...

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

Re: Получение привилегий в Vista

Сообщение iGrok » 14.02.2009 (Сб) 13:12

looking писал(а):
tyomitch писал(а):
looking писал(а):А добавлять в Планироващик заданий (так он по-русски называется?) программно - та ещё задача!

Никакой проблемы, кстати.
Там довольно удобный COM-интерфейс.

Я знаю несколько человек, которые отключают планировщик по разным причинам...

Ну так ты определись, что тебя смущает: то, что планировщик отключен, или то, что добавлять трудно.. )

З.Ы. А мой способ тебя в итоге так и не устроил?
label:
cli
jmp label

looking
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 01.02.2009 (Вс) 16:54

Re: Получение привилегий в Vista

Сообщение looking » 15.02.2009 (Вс) 9:27

iGrok, огромное тебе спасибо! Верна поговорка, что всё гениальное - просто. Молчал в связи с занятостью ноутбука в работе. Возможность проверить прикреплённый тобой код получил только вчера, 14.02.09. Я его немного упростил, в основном за счёт применения функций API для работы с реестром. Работает как часы, уже дописал строчки кода в свою программу. Конечно, в Vista она не так полезна, как в XP. Мне хотелось бы письменно выразить тебе благодарность в файле ReadMe версии своей программы, которую я планирую разместить на FreeSoft. Как мне можно указать сведения о тебе? "iGrok" слишком неинформативно.
Код: Выделить всё
'Модуль:
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Declare Function RegCreateKey& Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long)
Public Declare Function RegOpenKey& Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long)
Public Declare Function RegSetValueEx& Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long)
Public Declare Function RegDeleteValue& Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String)
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Public Const HKEY_LOCAL_MACHINE As Long = &H80000002
Public Const REG_SZ = 1

Sub Main()
'проверка, не запущена ли программа с целью элевации в Vista:
If Left(Command, 5) = "/auto" Then
    ModifyRun 1
    Exit Sub
ElseIf Left(Command, 7) = "/unauto" Then
    ModifyRun 0
    Exit Sub
End If
'основное окно программы
Form1.Show
Load Form1
End Sub

Public Sub ModifyRun(CheckVal As Integer)
Dim PathExeName As String
Dim keyRun As Long
If CheckVal = 1 Then
    'занесение программы в автозагрузку
    PathExeName = IIf(Right$(App.EXEName, 4) = ".exe", App.EXEName, App.EXEName & ".exe")
    PathExeName = IIf(Right$(App.Path, 1) = "\", App.Path & PathExeName, App.Path & "\" & PathExeName)
    RegCreateKey& HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Run", keyRun
    RegSetValueEx& keyRun, App.EXEName, 0, REG_SZ, PathExeName, Len(PathExeName)
Else
    'удаление программы из автозагрузки
    RegOpenKey& HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Run", keyRun
    RegDeleteValue& keyRun, App.EXEName
End If
RegCloseKey keyRun
End Sub

'Форма "Form1" (+ CheckBox "Check1"), Проект-Свойства-Объект_запуска: "Sub Main"
Private Sub Form_Load()
Dim keyRun As Long, k as Long
Dim RegPath As String
Dim PathExeName As String
'чтение из реестра сведений об автозапуске:
RegOpenKey HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Run", keyRun
RegQueryValueExStr keyRun, App.EXEName, 0, 0, RegPath, k
RegPath = Space(k)
RegQueryValueExStr keyRun, App.EXEName, 0, 0, RegPath, Len(RegPath)
If k > 0 Then
    PathExeName = IIf(Right$(App.Path, 1) = "\", App.Path & App.EXEName, App.Path & "\" & App.EXEName)
    If PathExeName = Left(RegPath, Len(PathExeName)) Then Check1.Value = 1
End If
End Sub

Private Sub Check1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim PathExeName As String
Dim CommandKey As String
PathExeName = IIf(Right$(App.EXEName, 4) = ".exe", App.EXEName, App.EXEName & ".exe")
CommandKey = IIf(Check1.Value = 1, "/auto", "/unauto")
'запуск второй копии программы для элевации:
ShellExecute hwnd, "runas", PathExeName, CommandKey, App.Path, 1
End Sub

Про планировщик заданий. Нет смысла связывать работу своей программы с приложением, которое пользователь с большой долей вероятности отключит.
А вообще я очень благодарен всем за отклик. Интересное и полезное (как минимум для меня) получилось обсуждение. Раньше я скептически относился к форумам (отрицательный опыт хамства, надменности и насмешек в свой адрес в сочетании с отсутствием конкретной помощи). Мой вопрос считаю закрытым.

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

Re: Получение привилегий в Vista

Сообщение iGrok » 15.02.2009 (Вс) 12:53

Ох ты ж! )
Самому была интересна проблема, плюс как раз неделю назад наталкивался где-то на этот вариант, пока искал решение другой проблемы с Vistой. Поэтому вспомнил, нашёл, а благодаря недоверчивости ANDLL ещё и проверил. =)
Вариант, конечно, не идеален. Но, ИМХО, вполне применим. По крайней мере, откровенных минусов я не вижу.

looking писал(а):"iGrok" слишком неинформативно.

Ну если уж так хочется меня упомянуть, так и пиши iGrok с форума "bbs.vbstreets.ru". =)) Всё равно, все кто обо мне что-то сылшал, знают меня как iGrok'а. =)
label:
cli
jmp label

looking
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 01.02.2009 (Вс) 16:54

Re: Получение привилегий в Vista

Сообщение looking » 15.02.2009 (Вс) 15:47

iGrok писал(а):Ох ты ж! )
Ну если уж так хочется меня упомянуть, так и пиши iGrok с форума "bbs.vbstreets.ru". =))

Договорились. DiskCont 1.11. ReadMe.txt

Пред.

Вернуться в Раздел для Профессионалов

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

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

    TopList