PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » Запуск приложения с правами системы


Запуск приложения с правами системы

Сообщений 1 страница 3 из 3

1

Понадобилось почистить реестр от некоторых USB HID устройств (в результате эксперимента накопилось много мусора). Прав администратора оказалось недостаточно ни для очистки, ни для присвоения необходимых прав - всегда появлялось сообщение "Отказано в доступе".
Выходом стал запуск редактора реестра с правами системы с помощью этого кода (запускать с правами администратора).

Код:
#SE_ASSIGNPRIMARYTOKEN_PRIVILEGE = 3
#SE_INCREASE_QUOTA_PRIVILEGE = 5
#SE_DEBUG_PRIVILEGE = 20 
#SE_IMPERSONATE_PRIVILEGE = 29

#LOGON_WITH_PROFILE = 1
#LOGON_NETCREDENTIALS_ONLY = 2

Structure ProcInfo
  Name.s
  PID.l
EndStructure

Prototype pCreateProcessWithTokenW(hToken, dwLogonFlags.l, *ApplicationName, *CommandLine, dwCreationFlags.l,
                                   *lpEnvironment, *lpCurrentDirectory, *lpStartupInfo, *lpProcessInfo)

Global CreateProcessWithTokenW.pCreateProcessWithTokenW=0

Procedure GetProcess(List ProcList.ProcInfo())
  Protected pe32.PROCESSENTRY32
  Protected hthSnapshot
  
  pe32\dwSize = SizeOf(PROCESSENTRY32)
  ClearList(ProcList())
  
  hthSnapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  Process32First_(hthSnapshot, @pe32) 
  While Process32Next_(hthSnapshot, @pe32) 
    If AddElement(ProcList())
      ProcList()\Name = PeekS(@pe32\szExeFile)
      ProcList()\PID  = pe32\th32ProcessID
    EndIf
  Wend 
  
EndProcedure



Procedure RunProc_System(HostPID, RunProg.s, CmdLine.s="")
  Protected hProc=0, hToken=0, DupToken=0
  Protected pEnvBlock=0, s.s, Res = #False
  Protected PI.PROCESS_INFORMATION, SI.STARTUPINFO
  
  hProc = OpenProcess_(#PROCESS_ALL_ACCESS, #False, HostPID)
  If hProc
    If OpenProcessToken_(hProc, #TOKEN_DUPLICATE, @hToken) And hToken
      If DuplicateTokenEx_(hToken, #TOKEN_ALL_ACCESS, #Null, 1, 1, @DupToken) And DupToken
        
        s = "winsta0\default"
        SI\cb = SizeOf(SI)
        SI\lpDesktop = @s
        
        If Left(RunProg, 1)<>Chr(34)
          RunProg = Chr(34)+RunProg+Chr(34)
        EndIf
          
        If CmdLine<>""
          If Left(CmdLine, 1)<>" "
            RunProg+" "
          EndIf
          RunProg+CmdLine
        EndIf
        
        If CreateProcessWithTokenW And 
           CreateProcessWithTokenW(DupToken, #LOGON_WITH_PROFILE, #Null, @RunProg, #NORMAL_PRIORITY_CLASS,
                                   #Null, #Null, @SI, @PI)
          Res = #True
        ElseIf CreateProcessAsUser_(DupToken, #Null, RunProg, #Null, #Null, #False, #NORMAL_PRIORITY_CLASS,
                                  #Null, #Null, @SI, @PI)
          Res = #True
        EndIf
          
        If PI\hThread
          CloseHandle_(PI\hThread)
        EndIf
        If PI\hProcess
          CloseHandle_(PI\hProcess)
        EndIf
        
        CloseHandle_(DupToken)
      EndIf
      CloseHandle_(hToken)
    EndIf
    CloseHandle_(hProc)
  EndIf
  
  ProcedureReturn Res
EndProcedure


Procedure RunSys(RunFile.s, Param.s)
  Static Advapi32_lib=0
  Protected NewList Proc.ProcInfo()
  Protected x=0, PID=0
  
  If CreateProcessWithTokenW=0
    If Advapi32_lib=0
      Advapi32_lib=LoadLibrary_("Advapi32.dll")
    EndIf
    If Advapi32_lib
      CreateProcessWithTokenW=GetProcAddress_(Advapi32_lib, ?Funct)
    EndIf
  EndIf
  
  RtlAdjustPrivilege_(#SE_DEBUG_PRIVILEGE, #True, 0, @x) ; Получаем привилегию отладчика.
  x=0
  RtlAdjustPrivilege_(#SE_IMPERSONATE_PRIVILEGE, #True, 0, @x)
  x=0
  RtlAdjustPrivilege_(#SE_INCREASE_QUOTA_PRIVILEGE, #True, 0, @x)
  x=0
  RtlAdjustPrivilege_(#SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, #True, 0, @x)
  
  GetProcess(Proc())
  ForEach Proc()
    x=0
    If LCase(Proc()\Name)="winlogon.exe"
      PID = Proc()\PID
      Break
    EndIf
  Next

  If PID>0
    RunProc_System(PID, RunFile, Param)
  EndIf
  
  ProcedureReturn
  
  DataSection
    Funct:
    !db "CreateProcessWithTokenW", 0, 0
  EndDataSection
EndProcedure

RunSys("C:\Windows\regedit.exe", "")

0

2

Пётр
Я добавил код, чтобы можно было добавить в контекстное меню и запускать в том числе ассоциированную программу, если файл не исполняемый.
SystemPrivileges.7z

Вот уточнение по поводу как работает TrustedInstaller, может и это осуществить?
https://usbtor.ru/viewtopic.php?p=77911#77911
https://usbtor.ru/viewtopic.php?p=77914#77914

0

3

AZJIO написал(а):

Вот уточнение по поводу как работает TrustedInstaller, может и это осуществить?

Попробуй сделать вот что.
Запусти TrustedInstaller и передай его PID процедуре RunProc_System().

0


Вы здесь » PureBasic - форум » OpenSource » Запуск приложения с правами системы