Мне нужно получить повышенные учетные данные (для запуска службы) в приложении VB6, но только если пользователю необходимо перезапустить службу (Т.е. я не хочу получать повышенные учетные данные при запуске приложения , только когда пользователь выбирает перезапуск). Как я могу это сделать в VB6?Повышенные полномочия для VB6
ответ
Довольно просто, но предпочтительный способ включает в себя новый повышенный процесс. В этом примере сам используется с коммутатором, который должен знать для запуска Сервисного запуска вместо обычных операций:
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
Одним из решений является использование прозвища отметки COM http://msdn.microsoft.com/en-us/library/ms679687(VS.85).aspx.
Эта ссылка должна быть полезной, если ваша цель - VB6 http://www.vbforums.com/showthread.php?t=459643.
Вам нужно будет позвонить в WinAPI - CoImpersonateClient или LogonUser.
Не забудьте впоследствии опустить свои привилегии и быть осторожным, чтобы делать то, что вы делаете при поднятии (например, не делайте НИКАКОГО с пользовательским вводом).
Другой вариант, который, по моему мнению, является предпочтительным (если доступно), заключается в использовании сконфигурированного COM + объекта. Вы можете иметь подсистему COM + для управления учетными данными и просто ограничить доступ для вызова объекта по мере необходимости. Это имеет преимущество создания и ACTUAL границы доверия между низкоприоритетным кодом и высокопривилегированным кодом.