1

VB6アプリケーションで(サービスを開始するために)昇格された資格情報を取得する必要がありますが、ユーザーがサービスを再起動する必要がある場合に限ります(つまり、ユーザーが再起動を選択した場合にのみ、アプリケーションが開始されるたびに昇格された資格情報を取得したくありません)。VB6でこれを行うにはどうすればよいですか?

4

3 に答える 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 に答える