2003Serverの、ユーザ名がSYSTEMのプロセスの強制終了の仕方

解決


Jun  2004-08-31 20:47:39  No: 85347

宜しくお願いします。

開発環境はVB6です。

作成したサービスから起動されるプロセスを強制終了したいのですが、そのやり方の参考になるものでもよいので教えて頂ければ嬉しいです。

詳細を書きます。

a.batというバッチファイルを、アプリケーションとサービスから起動する2種類の場合があります。
どちらもShell関数を使用して、プロセスIDは退避しています。

アプリケーションからの起動の場合は、退避してあるプロセスIDを使ってOpenProcessでプロセスハンドルを取得、TerminateProcessで強制終了できていますが、
サービスから起動した場合は、正しくプロセスIDを取得して同じように強制終了しようとしてもできません。

そのサービスのログオンはローカルシステムアカウント設定です。

どうかご助言をよろしくお願いします。


Jun  2004-08-31 21:07:36  No: 85348

2003Serverでは、DOSプロンプトのTaskKillを使って強制終了できることを確認しました。

2000ServerではTaskKillコマンドが実装されていないため、それに代わるものを探しています。

もしよろしければ参考になるものでもよいので教えていただけたら嬉しいです。
宜しくお願いします。


あん  2004-08-31 22:45:29  No: 85349

リソースキットのKILLコマンドは?


Jun  2004-08-31 23:44:04  No: 85350

お返事ありがとうございます!
2000のリソースキットからKillコマンド、調べてテストしてみます!


Jun  2004-09-01 04:13:54  No: 85351

あんさん、ありがとうございました。解決できました。

APIを調べているうちに、システム特権を有効にしてTerminateProcessを行えば強制終了できるようになりました。

参照はVBレスキュー花ちゃんサイトが主です。

'下記ソース
Public Type LUID
  UsedPart As Long
  IgnoredForNowHigh32BitPart As Long
End Type

Public Type TOKEN_PRIVILEGES
  PrivilegeCount As Long
  TheLuid As LUID
  Attributes As Long
End Type

'プロセスに関連付けられているアクセストークンを開きます。
Public Declare Function OpenProcessToken Lib "advapi32" _
    (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
    TokenHandle As Long) As Long

'カレントプロセスの擬似ハンドルを返す(P656)
Public Declare Function GetCurrentProcess Lib "KERNEL32" () As Long

'ローカル一意識別子(LUID)を取得し、指定された特権名を表現します
Public Declare Function LookupPrivilegeValue Lib "advapi32" _
    Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, _
    ByVal lpName As String, lpLuid As LUID) As Long
'指定したアクセストークン内の特権を有効または無効にします
Public Declare Function AdjustTokenPrivileges Lib "advapi32" _
    (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, _
    NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _
    PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Public Const TOKEN_QUERY = &H8
Public Const TOKEN_ADJUST_PRIVILEGES = &H20
Public Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Public Const SE_DEBUG_NAME = "SeDebugPrivilege"
Public Const SE_PRIVILEGE_ENABLED = &H2

Private Function ProcessDelete() As Boolean
    Dim lngResult    As Long
    Dim hTokenHandle As Long
    Dim tmpLuid      As LUID
    Dim tkpNew       As TOKEN_PRIVILEGES
    Dim tkpPrevious  As TOKEN_PRIVILEGES
    
    ProcessDelete = True    
    
    'プロセスに関連づけアクセストークンのオープン
    lngResult = OpenProcessToken(GetCurrentProcess, TOKEN_QUERY Or TOKEN_ADJUST_PRIVILEGES, hTokenHandle)
    If lngResult = 0 Then
        ProcessDelete = False
        Exit Function
    End If

    'ローカルシステムのシステムプロセス特権を取得
    lngResult = LookupPrivilegeValue(vbNullString, SE_DEBUG_NAME, tmpLuid)
    If lngResult = 0 Then
        ProcessDelete = False
        Exit Function
    End If

    tkpNew.PrivilegeCount = 1
    tkpNew.TheLuid = tmpLuid
    tkpNew.Attributes = SE_PRIVILEGE_ENABLED

    'アクセストークンの特権を変更する
    lngResult = AdjustTokenPrivileges(hTokenHandle, False, tkpNew, Len(tkpPrevious), tkpPrevious, 0&)
    If lngResult = 0 Then
        ProcessDelete = False
        Exit Function
    End If

End Function

上記のProcessDeleteを戻り値Trueで正常に通ってきたあとで、
希望のプロセスIDからハンドル取得、TerminateProcessでプロセス終了ができました。

ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加