2009-02-05 1 views
1

Мне нужно получить повышенные учетные данные (для запуска службы) в приложении VB6, но только если пользователю необходимо перезапустить службу (Т.е. я не хочу получать повышенные учетные данные при запуске приложения , только когда пользователь выбирает перезапуск). Как я могу это сделать в VB6?Повышенные полномочия для VB6

ответ

3

Довольно просто, но предпочтительный способ включает в себя новый повышенный процесс. В этом примере сам используется с коммутатором, который должен знать для запуска Сервисного запуска вместо обычных операций:

VERSION 5.00 
Begin VB.Form Form1 
    BorderStyle  = 1 'Fixed Single 
    Caption   = "Form1" 
    ClientHeight = 3060 
    ClientLeft  = 45 
    ClientTop  = 345 
    ClientWidth  = 4560 
    LinkTopic  = "Form1" 
    MaxButton  = 0 'False 
    MinButton  = 0 'False 
    ScaleHeight  = 3060 
    ScaleWidth  = 4560 
    StartUpPosition = 3 'Windows Default 
    Begin VB.CommandButton Command1 
     Caption   = "Start Service" 
     Height   = 495 
     Left   = 1448 
     TabIndex  = 0 
     Top    = 1283 
     Width   = 1665 
    End 
End 
Attribute VB_Name = "Form1" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = False 
Attribute VB_PredeclaredId = True 
Attribute VB_Exposed = False 
Option Explicit 

Private Const BCM_SETSHIELD As Long = &H160C& 

Private Declare Function SendMessage Lib "user32" _ 
    Alias "SendMessageA" (_ 
    ByVal hWnd As Long, _ 
    ByVal wMsg As Long, _ 
    ByVal wParam As Long, _ 
    lParam As Any) As Long 

Private 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 

Private Sub Command1_Click() 
    ShellExecute hWnd, "runas", App.EXEName & ".exe", "-start", CurDir$(), vbNormalFocus 
End Sub 

Private Sub Form_Load() 
    If UCase$(Trim$(Command$())) = "-START" Then 
     Caption = "Starting Service" 
     Command1.Visible = False 
     'Service starting functionality goes here. 
    Else 
     Caption = "Service Starter" 
     'For Shield to work you must have a Common Controls v. 6 
     'manifest and call InitCommonControls before loading 
     'this form (i.e. preferably from Sub Main). 
     SendMessage Command1.hWnd, BCM_SETSHIELD, 0&, 1& 
     Command1.Visible = True 
    End If 
End Sub 
0

Вам нужно будет позвонить в WinAPI - CoImpersonateClient или LogonUser.
Не забудьте впоследствии опустить свои привилегии и быть осторожным, чтобы делать то, что вы делаете при поднятии (например, не делайте НИКАКОГО с пользовательским вводом).

Другой вариант, который, по моему мнению, является предпочтительным (если доступно), заключается в использовании сконфигурированного COM + объекта. Вы можете иметь подсистему COM + для управления учетными данными и просто ограничить доступ для вызова объекта по мере необходимости. Это имеет преимущество создания и ACTUAL границы доверия между низкоприоритетным кодом и высокопривилегированным кодом.