VB6的提升凭据
我需要获得提升的凭据才能在VB6应用程序中启动服务,但仅当用户需要重新启动服务时,即我不希望在应用程序启动时获得提升的凭据,仅当用户选择重新启动时。如何在VB6中执行此操作?一种解决方案是使用COM提升名字对象VB6的提升凭据,vb6,windows-vista,elevated-privileges,Vb6,Windows Vista,Elevated Privileges,我需要获得提升的凭据才能在VB6应用程序中启动服务,但仅当用户需要重新启动服务时,即我不希望在应用程序启动时获得提升的凭据,仅当用户选择重新启动时。如何在VB6中执行此操作?一种解决方案是使用COM提升名字对象 如果您的目标是VB6,此链接应该很有用。一种解决方案是使用COM提升名字对象 如果您的目标是VB6,此链接应该很有用。您需要调用WinAPI-CoImpersonatClient或LogonUser。 只需记得在之后降低您的权限,并在提升权限时小心操作,例如,不要对用户输入执行任何操作
如果您的目标是VB6,此链接应该很有用。一种解决方案是使用COM提升名字对象
如果您的目标是VB6,此链接应该很有用。您需要调用WinAPI-CoImpersonatClient或LogonUser。 只需记得在之后降低您的权限,并在提升权限时小心操作,例如,不要对用户输入执行任何操作
另一个选择是使用COM+配置的对象,我认为如果可用的话,这是更可取的。您可以让COM+子系统管理凭据,并根据需要限制访问以调用对象。这有利于在低特权代码和高特权代码之间创建和实际信任边界。您需要调用WinAPI-CoImpersonaeClient或LogonUser。 只需记得在之后降低您的权限,并在提升权限时小心操作,例如,不要对用户输入执行任何操作
另一个选择是使用COM+配置的对象,我认为如果可用的话,这是更可取的。您可以让COM+子系统管理凭据,并根据需要限制访问以调用对象。这有助于在低特权代码和高特权代码之间创建和实际信任边界。相当容易,但首选方法涉及一个新的提升过程。此示例使用自身与交换机一起运行来执行服务启动,而不是正常操作:
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
相当容易,但首选的方法涉及一个新的提升过程。此示例使用自身与交换机一起运行来执行服务启动,而不是正常操作:
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