powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
18 сообщений из 18, страница 1 из 1
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38314580
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Естественно раздел создается "администратором".
Т.е. программа при инсталляции делает общий раздел
HKEY_LOCAL_MACHINE\SOFTWARE\Company\Product
и лепит туда атрибут
Пользователи (Users) = Полный доступ
Это чтоб любой пользователь компьютера мог туда писать (конкретно мне надо положить туда лицензионный ключ, чтоб это можно было сделать из под любого аккаунта и отовсюду виделся).
Честно, я такой практики (Пользователи (Users) = Полный доступ) в HKEY_LOCAL_MACHINE не вижу.
Но знаю что это сделать можно (ручками).
По опыту: надоели претензии по типу я ввел ключ, перегрузил комп, а он пишет NOT REGISTERED (понятно если ключ лежит в HKCU).
А повышать права с требованием пароля админа (да и не знаю как это сделать) - или выводить ошибку если прога не под админом - тоже не хочу.

RegCreateKeyEx+SECURITY_ATTRIBUTES -?
Примеры есть?
Там структуры кажись не хилые.

Ну или как произвести запись со стандартными атрибутами HKEY_LOCAL_MACHINE в тек. (не-админском) сеансе проги с повышением прав и вводом пароля админа?
Второй вариант наверно красивше и правильней. Понижать права потом смысла нет, т.к. ввод лицензии по любому предполагает перезагрузку проги (прога ключи на ходу кушать все одно не умеет).
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38314632
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не доделал пока, но предварительные тесты положительные.

Идея такая:

Выясняем через API, под админом ли запущена прога.
Если ДА, то в ней все и делаем.
Если НЕТ, то через ShellExecuteEx запускаем наш же exe-шник под админом (это красиво выглядит, т.к. админа запрашивает как бы наш же exe шник), но запускаем с ключом
proga.exe /key=1234567887778787
Делаем админ-версией чего надо и выходим, при этом возвращаем Exit Code true/false в неадминскую запущенную версию.
Как-то так.
По идее таким макаром можно сделать любое действо, требующее админа и при этом остаться на своих (неадминских) правах продолжая работать в том же экземпляре проги.
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38324376
Integrator2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что мешает хранить лицензионный ключ просто в текстовый файл Licence.txt (или .lcd или .lic ...) в папке C:\Programs\Имя программы\ в зашифрованном виде? Если юзер удалит файл или изменит его контент, то получит неработоспособную программу...
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38324581
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integrator2А что мешает хранить лицензионный ключ просто в текстовый файл Licence.txt (или .lcd или .lic ...) в папке C:\Programs\Имя программы\ в зашифрованном виде? Если юзер удалит файл или изменит его контент, то получит неработоспособную программу...

Какая разница куда его класть: в Licence.txt или в реестр.
>C:\Programs\Имя программы\
Ну, во-первых в эту папку имеет доступ только admin.
Во вторых если юзер удалит, то неработоспособную программу получит не только он один.
Поэтому правильно
1) видеть ключ должны ВСЕ
2) менять ключ должен иметь право только admin

Логика с вызовом админа при вводе ключа правильная (где бы он ни был).
При этом окно ввода ключа доступно и из юзер-запуска программы (с вводом пароля админа при вызове действия).
И я все уже сделал как написал выше.
В чем вопрос?
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38324797
Integrator2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос в том, как организовать эффективную модель защиты и правильное хранение лицензионного кода.
HKEY_LOCAL_MACHINE - это трудная ветка, куда писать не так просто (проблемы с безопасностью). Не исключено, что в разных ОС правила игры могут меняться (разрешения на чтение/запись).
Предложение - хранить код не в этой ветке, и не в реестре вообще, а в специальном файле или, как вариант, в базе данных, в какой-нибудь специальной настроечной таблице приложения. А лучше во многих местах сразу. Но всегда в зашифрованном виде. Удалять файл (или запись в БД) никто не будет, тк получается неработающая программа (за что, конечно, простой юзер получит по рукам). Да и вообще подобные злонамеренные сценарии я бы не рассматривал всерьез - и реестр юзер может "почистить" с помощью какой-нибудь специализированной программы (если есть доступ), и файл любой удалить может (если опять же есть доступ).
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38324867
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integrator2Вопрос в том, как организовать эффективную модель защиты...хранить код...в специальном файле... в базе данных...лучше во многих местах сразу....Но всегда в зашифрованном виде...
Я не понимаю, ты предлагаешь защищать программу СВОИМИ средствами и пытаешься запутать хакеров храня ключ в нестандартном месте и "зашифровав" его?
Если так, то эта защита будет взломана быстро.
Если используешь специальные средства защиты (AsProtect например) то дополнительно "шифровать" ключ да еще засовывать его в нестандартные места мне кажется бредом.
Если ключ уже есть, то секретом сам по себе равно как и место его хранения не является. Ты этот ключ случайно не придумаешь.

Integrator2HKEY_LOCAL_MACHINE - это трудная ветка, куда писать не так просто (проблемы с безопасностью). Не исключено, что в разных ОС правила игры могут меняться (разрешения на чтение/запись)....
HKEY_LOCAL_MACHINE - это как раз стандартное место которое
1) В режиме READ одинаково видят все
2) В режиме WRITE доступно только администратору.
И других правил игры я вплоть до Win8 включительно не видел.

Можно писать в HKEY_CURRENT_USER, но вопрос "Я лицензировал программу, перегрузился, а она не работает" (читай зашел под другим пользователем) поступит от кого-нибудь довольно быстро.

Дальше, любую ветку реестра (включая HKEY_LOCAL_MACHINE ), любую папку (да ту же Program Files) можно сделать общедоступной (как READ так и WRITE). И я этим раньше очень злоупотреблял. Инсталлятору (запускается под Admin) под силу это сделать.
Для полного доступа к папке всех и вся достаточно выполнить команду:
Код: vbnet
1.
2.
      ShellAndContinue "icacls.exe " & Chr(34) & path_FullAccess & Chr(34) & _
       " /grant " & UsersGroupName & ":(OI)(CI)F /T", vbHide



Для реестра, то же самое, можно пойти в HKLM, выбрать там любую подветку и поменять параметры безопасности. Очевидно что API ф-ции реестра это тоже могут сделать из-под админа.
И если ты внимательно читал мой первый топик, то мог понять что именно это я и хотел сделать.
Но хватило мозгов все-таки так не сделать, а сделать нормально.
Потому как злоупотребления разрешениями, равно как и приписывание exe-шникам флагов RunAsAdmin (неважно в манифесте или через галку в реестре) нарушает правильную природу виндов, чему в последних версиях начиная с Висты уделяется большое внимание и проще с этим потихоньку соглашаться нежели кричать "Отключи UAC, запускай из под админа" на все случаи жизни.
К слову скажем, подавляющее большинство антивирусов тупо ругаются на файлы, где в манифесте прописан Admin (поэтому если уж злоупотреблять админом, то надо это делать через галки в реестре а не через манифест).
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38325511
Integrator2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Дмитрий77 за твою подробную консультацию и опыт.
Хочется сказать пару "но":
1. Хранить регкод, являющийся своеобразным "произведением искусства" своей собственной защиты, лучше во многих местах, взломщики всех мест и их общее количество не знают, взломают только один (первый) уровень защиты. И, если защита многоуровневая, и последующие проверки включаются по истечении определенного случайного времени... то обмануть хакеров очень даже можно.
2. Покупал ли ты когда-нибудь платные .NET-компоненты? Часто присутствует файл License, в котором как раз инфа по лицензии содержится в зашифрованном виде. Заметь, не в реестре, а простой текстовый файл. И расшифровать его не представляется возможным.
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38325755
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integrator2 Покупал ли ты когда-нибудь платные .NET-компоненты?Нет.

Мне все-таки думается что мы о разных вещах говорим.
Вопрос был
1) Как задать определенные права доступа для конкретной ветки реестра?
либо
2) Как из программы, запущенной от имени USER выполнить операцию, на которую имеет право только ADMIN?
Т.к. я успешно решил (2), то (1) я прорабатывать не стал.
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38529084
Клевер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, выложи плз апи проверки, под админом ли запущена прога, и код запуска её от админа...
моя прога "умирает" в случае ошибки и в предсмертном сообщении просит перезапустить её от админа
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38529120
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А осилишь?

Клеверпод админом ли запущена прога
Код: vbnet
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.
Private Const SECURITY_BUILTIN_DOMAIN_RID As Long = &H20
Private Const DOMAIN_ALIAS_RID_ADMINS As Long = &H220

Private Declare Function AllocateAndInitializeSid Lib "advapi32.dll" (pIdentifierAuthority As Any, _
 ByVal nSubAuthorityCount As Byte, ByVal nSubAuthority0 As Long, ByVal nSubAuthority1 As Long, _
 ByVal nSubAuthority2 As Long, ByVal nSubAuthority3 As Long, ByVal nSubAuthority4 As Long, _
 ByVal nSubAuthority5 As Long, ByVal nSubAuthority6 As Long, ByVal nSubAuthority7 As Long, _
 lpPSid As Long) As Long
Private Declare Sub FreeSid Lib "advapi32.dll" (ByVal pSid As Long)
Private Declare Function CheckTokenMembership Lib "advapi32.dll" (ByVal hToken As Long, _
 ByVal pSidToCheck As Long, pbIsMember As Long) As Long

Private Type SID_IDENTIFIER_AUTHORITY
  Value(0 To 5) As Byte
End Type

Public Function IsAdministrator() As Boolean
  Dim NtAuthority As SID_IDENTIFIER_AUTHORITY
  Dim pAdministratorGroup As Long
  Dim lResult As Long

  NtAuthority.Value(5) = 5

  If AllocateAndInitializeSid(NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, _
   0, 0, 0, 0, pAdministratorGroup) <> 0 Then
    If CheckTokenMembership(0, pAdministratorGroup, lResult) <> 0 Then
      IsAdministrator = (lResult <> 0)

      Exit Function
    End If

    Call FreeSid(pAdministratorGroup)
  End If

  IsAdministrator = False
End Function


Клевери код запуска её от админа...

Код: vbnet
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.
    Dim FilePath As String
    FilePath = App.Path & "\" & App.EXEName & ".exe"
    ExecuteProcess(FilePath, 0, SW_NORMAL, "[параметры командной строки]", True)
===
'--- for WaitForXxx
Private Const INFINITE As Long = &HFFFFFFFF
'--- for ShellExecuteEx
Private Const SEE_MASK_NOCLOSEPROCESS As Long = &H40
Private Const SEE_MASK_DEFAULT = &H0

Private Type SHELLEXECUTEINFO
  cbSize As Long
  fMask As Long
  hwnd As Long
  lpVerb As String
  lpFile As String
  lpParameters As String
  lpDirectory As String
  nShow As Long
  hInstApp As Long
  lpIDList As Long
  lpClass As String
  hkeyClass As Long
  dwHotKey As Long
  hIcon As Long
  hProcess As Long
End Type

Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" _
 (pExecInfo As SHELLEXECUTEINFO) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" _
 (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long

Public Enum ExecuteStatus
  res_OK
  res_FAILED
  res_CANCEL
End Enum

Public Function ExecuteProcess(ByVal FilePath As String, ByVal hwnd As Long, _
 ByVal nShow As Long, Optional lpParameters As String = "", _
 Optional LaunchElevated As Boolean = False) As ExecuteStatus 'ByVal nShow As ShowConstants
 
  Dim ExecInfo As SHELLEXECUTEINFO
  Dim lExitCode As Long

  On Error GoTo Hell

  With ExecInfo
    ' Set up the structure.
    .cbSize = Len(ExecInfo)
    .fMask = SEE_MASK_NOCLOSEPROCESS ' SEE_MASK_DEFAULT
    .lpFile = FilePath
    .nShow = nShow
    .lpDirectory = ExtractDirectoryFromPath(FilePath)
    .lpParameters = lpParameters
    .hwnd = hwnd

    ' On Microsoft Windows Vista and later, one can use runas instead of Open, in order to execute the
    ' process as an elevated process. In that case, the user will be asked whether he or she wants to
    ' run the process as an administrator.
    If LaunchElevated = True Then
      .lpVerb = "runas"
    Else
      .lpVerb = "Open"
    End If
  End With

  If ShellExecuteEx(ExecInfo) Then
    Call WaitForSingleObject(ExecInfo.hProcess, INFINITE)
    If GetExitCodeProcess(ExecInfo.hProcess, lExitCode) <> 0 Then
      If lExitCode = 0 Then
        ExecuteProcess = res_OK
      Else
        ExecuteProcess = res_FAILED
      End If
    Else
      ExecuteProcess = res_FAILED
    End If
    Call CloseHandle(ExecInfo.hProcess)
  Else
    ExecuteProcess = res_CANCEL
  End If

  Exit Function

Hell:
  ExecuteProcess = False
End Function

Private Function ExtractDirectoryFromPath(Path As String) As String
  On Error Resume Next

  Dim Position As Long

  ' Find the right-most slash.
  Position = InStrRev(Path, "\")

  ' Extract everything on the left.
  ExtractDirectoryFromPath = Left$(Path, Position - 1)
End Function


res_CANCEL -означает что приложение не было запущено, т.е. пользователь не ввел пароль админа или ввел неверный
res_OK и res_FAILED -соответствует кодам возврата приложения.
То что в C++ пишется как
return 0;
return 1;
VB6 всегда возвращает
return 0;
Но это можно изменить:
Код: vbnet
1.
2.
3.
Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)

ExitProcess 1 'код возврата, отличный от нуля, напр. означает ошибку
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38529237
Клевер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, буду разбираться, спасибо!)
Код: vbnet
1.
On Error GoTo Hell

порадовало)))
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38529893
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клевер
Код: vbnet
1.
On Error GoTo Hell

порадовало)))
Убери, это чушь.
Как и последние 3 строчки. Видимо осталось из какого-то примера, в кот. я глядел.
Можешь по идее заменить

Код: vbnet
1.
2.
3.
4.
5.
.fMask = SEE_MASK_DEFAULT
...
ShellExecuteEx ExecInfo

и сделать из ф-ции Sub()



В моем случае я возвращаю результат админского экземпляра проги в неадминский и продолжаю работать в неадминском.
Что надо тебе, я не знаю, думай сам и читай msdn.
Я подгонял ф-цию под свои нужды.
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38530728
Клевер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
решил проверить запуск от админа. создалось 1400 процессов, виртуальная машина сдохла, запустилась с 3 перезагрузки, комп пришлось "душить" вручную. грусть-печаль( не мог не заметить: я запускал прогу на виртуалке на винде XP. никаких прав не нужно. но код упорно выставлял своё окошко непонятно зачем
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38530734
Клевер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, сё, разобрался. всё работает идеально, большущее спасибо)
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38530737
Клевер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из-за перезагрузки слетел весь код, что я писал последние несколько дней на виртуальной машине. придётся восстанавливать по памяти. эхь, программист - воплощение терпения
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38607836
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Т.е. программа при инсталляции делает общий раздел
HKEY_LOCAL_MACHINE\SOFTWARE\Company\Product
и лепит туда атрибут
Пользователи (Users) = Полный доступ

Код: vbnet
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.
' ==icacls.exe "C:\Documents and Settings\All Users\Application Data\Proga" /grant Пользователи:(OI)(CI)F /T
' DoFullAccessFileFolder("C:\Documents and Settings\All Users\Application Data\Proga")
Public Function DoFullAccessFileFolder(FileFolderPath As String) As Long
  DoFullAccessFileFolder = AddAceToObjectsSecurityDescriptor(FileFolderPath, _
   SE_FILE_OBJECT, _
   ConstructUniversalAndNTWellKnownSids("Users"), _
   GENERIC_ALL, _
   GRANT_ACCESS, _
   CONTAINER_INHERIT_ACE Or OBJECT_INHERIT_ACE)
End Function

' DoFullAccessRegistryEntry("MACHINE\SOFTWARE\MyProga")
' MACHINE -для HKLM
Public Function DoFullAccessRegistryEntry(RegistryPath As String) As Long
  DoFullAccessRegistryEntry = AddAceToObjectsSecurityDescriptor(RegistryPath, _
   SE_REGISTRY_KEY, _
   ConstructUniversalAndNTWellKnownSids("Users"), _
   GENERIC_ALL, _
   GRANT_ACCESS, _
   CONTAINER_INHERIT_ACE Or OBJECT_INHERIT_ACE)
End Function

Public Function AddAceToObjectsSecurityDescriptor(pszObjName As String, _
 ObjectType As SE_OBJECT_TYPE, pszTrustee As String, _
 dwAccessRights As Long, AccessMode As ACCESS_MODE, dwInheritance As Long) As Long
 
  Dim dwRes As Long
  Dim pOldDACL As Long, pNewDACL As Long
  Dim pSD As Long
  Dim ea As EXPLICIT_ACCESS
 
  If (pszObjName = "") Then
    AddAceToObjectsSecurityDescriptor = ERROR_INVALID_PARAMETER
    Exit Function
  End If
  
  'Get a pointer to the existing DACL.
  dwRes = GetNamedSecurityInfo(pszObjName, ObjectType, _
   DACL_SECURITY_INFORMATION, _
   0&, 0&, pOldDACL, 0&, pSD)
  If dwRes <> ERROR_SUCCESS Then
    MsgBox "GetNamedSecurityInfo Error " & CStr(dwRes)
    GoTo Cleanup
  End If
  
  'Initialize an EXPLICIT_ACCESS structure for the new ACE.
  BuildExplicitAccessWithName ea, pszTrustee, dwAccessRights, AccessMode, dwInheritance
  
  ' Create a new ACL that merges the new ACE into the existing DACL.
  dwRes = SetEntriesInAcl(1, ea, pOldDACL, pNewDACL)
  If dwRes <> ERROR_SUCCESS Then
    MsgBox "SetEntriesInAcl Error " & CStr(dwRes)
    GoTo Cleanup
  End If

  'Attach the new ACL as the object's DACL.
  dwRes = SetNamedSecurityInfo(pszObjName, ObjectType, _
   DACL_SECURITY_INFORMATION, _
   0&, 0&, pNewDACL, 0&)
  If dwRes <> ERROR_SUCCESS Then
    MsgBox "SetNamedSecurityInfo Error " & CStr(dwRes)
    GoTo Cleanup
  End If

Cleanup:
  If pSD <> 0 Then LocalFree pSD
  If pNewDACL <> 0 Then LocalFree pNewDACL
  
  AddAceToObjectsSecurityDescriptor = dwRes
End Function
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38646513
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то в ф-ции приведенной в посте 15427980 (где я жду код возврата от запущенного под админом процесса)
правильнее использовать цикл с DoEvents. Тогда вызывающее приложение не вешается в отличии от WaitForSingleObject(INFINITE).
Если допустим вызывающее приложение использует форму ну и к примеру на форме ничего нельзя нажимать пока выполняется администраторский процесс, правильнее поставить эту форму в Enabled=False, а не рассчитывать на WaitForSingleObject кот. коверкает на форме всю графику. Т.е. при useDoEvent=true код не вешает вызывающий исходный процесс и при этом получает сигнализацию об окончании выполнения вызванного админского процесса.


Код: vbnet
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.
Public Function ExecuteProcess(ByVal FilePath As String, ByVal hwnd As Long, _
 ByVal nShow As Long, Optional lpParameters As String = "", _
 Optional LaunchElevated As Boolean = False, _
 Optional useDoEvent As Boolean = False) As ExecuteStatus 'nShow - напр.SW_SHOWNORMAL
 
  'useDoEvent -использует цикл с DoEvent вместо WaitForSingleObject
 
  Dim ExecInfo As SHELLEXECUTEINFO
  Dim lExitCode As Long

  With ExecInfo
    ' Set up the structure.
    .cbSize = Len(ExecInfo)
    .fMask = SEE_MASK_NOCLOSEPROCESS ' SEE_MASK_DEFAULT
    .lpFile = FilePath
    .nShow = nShow
    .lpDirectory = ExtractDirectoryFromPath(FilePath)
    .lpParameters = lpParameters
    .hwnd = hwnd

    ' On Microsoft Windows Vista and later, one can use runas instead of Open, in order to execute the
    ' process as an elevated process. In that case, the user will be asked whether he or she wants to
    ' run the process as an administrator.
    If LaunchElevated = True Then
      .lpVerb = "runas"
    Else
      .lpVerb = "Open"
    End If
  End With

  If ShellExecuteEx(ExecInfo) Then
    If useDoEvent Then
      Do
        'Get the status of the process
        GetExitCodeProcess ExecInfo.hProcess, lExitCode
        DoEvents
        'Loop while the process is active
      Loop While lExitCode = STILL_ACTIVE
    Else
      Call WaitForSingleObject(ExecInfo.hProcess, INFINITE)
    End If
    If GetExitCodeProcess(ExecInfo.hProcess, lExitCode) <> 0 Then
      If lExitCode = 0 Then
        ExecuteProcess = res_OK
      Else
        ExecuteProcess = res_FAILED
      End If
    Else
      ExecuteProcess = res_FAILED
    End If
    Call CloseHandle(ExecInfo.hProcess)
  Else
    ExecuteProcess = res_CANCEL
  End If
End Function
...
Рейтинг: 0 / 0
HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
    #38655621
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ожидания завершения админского процесса не нужно, а скажем стоит задача
"Всегда запускать эту программу только администратором",
то код сильно упрощается. Сделал для себя такой вариант:


Код: vbnet
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.
Sub Main()
  If IsAdministrator Then
    FormMain.Show
  Else
    'запускаем себя же из-под администратора и выходим
    Dim FilePath As String
    FilePath = App.Path & "\" & App.EXEName & ".exe"
    ExecuteProcessAndExit FilePath, 0, SW_SHOWNORMAL, , True
  End If
End Sub


Public Function ExecuteProcessAndExit(ByVal FilePath As String, ByVal hwnd As Long, _
 ByVal nShow As Long, Optional lpParameters As String = "", _
 Optional LaunchElevated As Boolean = False) As ExecuteStatus 'nShow - напр.SW_SHOWNORMAL
 
  Dim ExecInfo As SHELLEXECUTEINFO
  Dim lExitCode As Long

  With ExecInfo
    ' Set up the structure.
    .cbSize = Len(ExecInfo)
    .fMask = SEE_MASK_DEFAULT 'вызывающий процесс не ждет кода завершения от вызываемого
    .lpFile = FilePath
    .nShow = nShow
    .lpDirectory = ExtractDirectoryFromPath(FilePath)
    .lpParameters = lpParameters
    .hwnd = hwnd

    ' On Microsoft Windows Vista and later, one can use runas instead of Open, in order to execute the
    ' process as an elevated process. In that case, the user will be asked whether he or she wants to
    ' run the process as an administrator.
    If LaunchElevated = True Then
      .lpVerb = "runas"
    Else
      .lpVerb = "Open"
    End If
  End With

  If ShellExecuteEx(ExecInfo) Then
    ExecuteProcessAndExit = res_OK
  Else
    ExecuteProcessAndExit = res_CANCEL
  End If
End Function



По сути это эквивалентно вистовскому манифесту с инструкцией
level=requireAdministrator
Но "requireAdministrator" -как показывает практика антивирус-недружественная инструкция (и не будет работать на XP).
В манифесте лучше всегда использовать "AsInvoker".
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / HKEY_LOCAL_MACHINE + AllUsers=FullControl либо как на ходу повысить права проги до админа?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]