Повышенные полномочия для VB6 - PullRequest
1 голос
/ 05 февраля 2009

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

Ответы [ 3 ]

3 голосов
/ 06 февраля 2009

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

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
1 голос
/ 06 февраля 2009

Одним из решений является использование обозначения возвышения COM http://msdn.microsoft.com/en-us/library/ms679687(VS.85).aspx.

Эта ссылка должна быть полезна, если ваша цель VB6 http://www.vbforums.com/showthread.php?t=459643.

0 голосов
/ 06 февраля 2009

Вам необходимо вызвать WinAPI - CoImpersonateClient или LogonUser.
Просто не забудьте потом понизить свои привилегии, и будьте чертовски осторожны в том, что вы делаете, когда повышены (например, не делайте ничего с пользовательским вводом).

Другой вариант, который, на мой взгляд, предпочтительнее (если доступен), заключается в использовании настроенного объекта COM +. Вы можете настроить подсистему COM + для управления учетными данными и просто ограничить доступ для вызова объекта по мере необходимости. Это дает преимущество создания и АКТУАЛЬНОЙ границы доверия между кодом с низким уровнем привилегий и кодом с высоким уровнем привилегий.

...