VB6アプリケーションで(サービスを開始するために)昇格された資格情報を取得する必要がありますが、ユーザーがサービスを再起動する必要がある場合に限ります(つまり、ユーザーが再起動を選択した場合にのみ、アプリケーションが開始されるたびに昇格された資格情報を取得したくありません)。VB6でこれを行うにはどうすればよいですか?
1710 次
3 に答える
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
于 2009-02-05T22:05:53.817 に答える
1
1 つの解決策は、COM 昇格モニカーhttp://msdn.microsoft.com/en-us/library/ms679687(VS.85).aspxを使用することです。
このリンクは、ターゲットが VB6 http://www.vbforums.com/showthread.php?t=459643の場合に役立ちます。
于 2009-02-05T21:59:05.920 に答える
0
WinAPI - CoImpersonateClient または LogonUser を呼び出す必要があります。
後で特権を下げることを忘れないでください。また、昇格したときに何をするかには十分注意してください (たとえば、ユーザー入力で何もしないでください)。
もう 1 つの選択肢として、COM+ で構成されたオブジェクトを使用する方法があります。COM+ サブシステムで資格情報を管理し、必要に応じてオブジェクトを呼び出すためのアクセスを制限することができます。これには、権限の低いコードと権限の高いコードの間に実際の信頼境界を作成するという利点があります。
于 2009-02-05T22:03:59.750 に答える