<Return[C]><Top>

CreateService

Declare Function Api_CreateService& Lib "advapi32" Alias "CreateServiceA" (ByVal SCM&, ByVal ServNa$, ByVal DispNa$, ByVal DeAcces&, ByVal ServType&, ByVal StartType&, ByVal ErrCtrl&, ByVal BinPath$, ByVal Load$, TagId&, ByVal Dep$, ByVal lp$, ByVal PSW$)

Declare Function CreateService Lib "advapi32" Alias "CreateServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal lpDisplayName As String, ByVal dwDesiredAccess As Long, ByVal dwServiceType As Long, ByVal dwStartType As Long, ByVal dwErrorControl As Long, ByVal lpBinaryPathName As String, ByVal lpLoadOrderGroup As String, lpdwTagId As Long, ByVal lpDependencies As String, ByVal lp As String, ByVal lpPassword As String) As Long

サービスオブジェクトを作成し、サービス制御マネージャ(Service Control Manager:SCM)の指定されたデータベースに追加する。

パラメータ
hSCManager
    [入力]サービス制御マネージャのデータベースのハンドルを指定する。OpenSCManager 関数が返したハンドルを指定し、これには

    SC_MANAGER_CREATE_SERVICE アクセス権が必要である。
lpServiceName
    [入力]インストールするサービスの名前を表す、NULL で終わる文字列へのポインタを指定する。この文字列の最大の長さは 256 文字

    である。サービス制御マネージャのデータベースは、ここで指定された大文字と小文字をそのまま維持する。ただし、サービス名を比較する

    ときは、常に大文字と小文字を区別しない。スラッシュ(/)と円記号(\)はサービス名には使えない。
lpDisplayName
    [入力]ユーザーインターフェイスプログラムがサービスを識別するために使う表示名を表す、NULL で終わる文字列へのポインタを指定す

    る。この文字列の最大の長さは 256 文字である。サービス制御マネージャは、ここで指定された大文字と小文字をそのまま維持する。た

    だし、表示名を比較するときは、常に大文字と小文字を区別しない。
dwDesiredAccess
    [入力]サービスに割り当てるアクセス権を指定する。要求されたアクセス権を許可する前に、システムは呼び出し側プロセスのアクセスト

    ークンをチェックする。
    STANDARD_RIGHTS_REQUIRED 定数は、サービスオブジェクトの次のアクセスタイプを認めている。

    標準的な権利                               

説明                                                                                                            

    DELETE

サービスを削除できるよう、DeleteService 関数の呼び出しを有効にする。

    READ_CONTROL

サービスオブジェクトのセキュリティ記述子を問い合わせできるよう、 関数の呼び出しを有効にする。

    WRITE_DAC | WRITE_OWNER

サービスオブジェクトのセキュリティ記述子を変更できるよう、 関数の呼び出しを有効にする。

    サービスオブジェクトの次のアクセスタイプのいずれか、またはすべてを指定することもできる。

    オブジェクトのアクセスタイプ                            

説明                                                                                                 

    SERVICE_ALL_ACCESS

 

この表に記載したアクセスタイプのすべて、および STANDARD_RIGHTS_REQUIRED をセットする。

    SERVICE_CHANGE_CONFIG

サービスの構成を変更できるよう、ChangeServiceConfig 関数の呼び出しを有効にする。

    SERVICE_ENUMERATE_DEPENDENTS

 

このサービスに依存する他のすべてのサービスを列挙できるよう、EnumDependentServices 関数の呼び出しを有効にする。

    SERVICE_INTERROGATE

 

サービスに現在のステータスを報告することを指示できるよう、ControlService 関数の呼び出しを有効にする。

    SERVICE_PAUSE_CONTINUE

 

サービスを一時停止または続行できるよう、ControlService 関数の呼び出しを有効にする。

    SERVICE_QUERY_CONFIG

サービスの構成を問い合わせできるよう、QueryServiceConfig 関数の呼び出しを有効にする。

    SERVICE_QUERY_STATUS

 

サービスのステータスについてサービス制御マネージャに問い合わせできるよう、QueryServiceStatus 関数の呼び出しを有効にする。

    SERVICE_START

サービスを開始できるよう、StartService 関数の呼び出しを有効にする。

    SERVICE_STOP

サービスを停止できるよう、ControlService 関数の呼び出しを有効にする。

    SERVICE_USER_DEFINED_CONTROL

 

ユーザー定義の制御コードを指定できるよう、ControlService 関数の呼び出しを有効にする。

    次の一般的なアクセス権のうち任意のものを指定することもできる。

    一般的なアクセス権     

サービスのアクセスタイプ                                                                                                     

    GENERIC_READ

 

 

アクセスタイプ STANDARD_RIGHTS_READ、SERVICE_QUERY_CONFIG、SERVICE_QUERY_STATUS、SERVICE_INTERROGATE、SERVICE_ENUMERATE_DEPENDENTS を組み合わせる。

    GENERIC_WRITE

アクセスタイプ STANDARD_RIGHTS_WRITE と SERVICE_CHANGE_CONFIG を組み合わせる。

    GENERIC_EXECUTE

 

 

アクセスタイプ STANDARD_RIGHTS_EXECUTE、SERVICE_START、SERVICE_STOP、SERVICE_PAUSE_CONTINUE、SERVICE_INTERROGATE、SERVICE_USER_DEFINED_CONTROL を組み合わせる。

dwServiceType
    [入力]サービスタイプを指定する。次のいずれかのサービスタイプを指定する。

    タイプ                                                    

意味                                                                                                    

    SERVICE_WIN32_OWN_PROCESS

サービスアプリケーションがそのアプリケーション専用のプロセス内で動作することを指定する。

    SERVICE_WIN32_SHARE_PROCESS

サービスアプリケーションが 1 つのプロセスを他のサービスと共有することを指定する。

    SERVICE_KERNEL_DRIVER

ドライバサービスを指定する。

    SERVICE_FILE_SYSTEM_DRIVER

ファイルシステムのドライバサービスを指定する。

    SERVICE_WIN32_OWN_PROCESS と SERVICE_WIN32_SHARE_PROCESS のどちらかを指定する場合は、次のタイプをともに指定

    することもできる。

    タイプ                                                    

意味                                                                                                    

    SERVICE_INTERACTIVE_PROCESS

サービスアプリケーションのプロセスがデスクトップと相互作用できるようにする。

    この値は、lpServiceStartName パラメータが LocalSystem アカウントの場合のみ有効である。
dwStartType
    [入力]サービスを開始する時期を指定する。次のいずれかの値を指定する。

    値                                          

意味                                                                                                                   

    SERVICE_BOOT_START

 

システムローダーが開始するデバイスドライバを指定する。この値は、ドライバサービスにのみ有効である。

    SERVICE_SYSTEM_START

 

IoInitSystem 関数が開始するデバイスドライバを指定する。この値は、ドライバサービスにのみ有効である。

    SERVICE_AUTO_START

システムの起動時にサービス制御マネージャが自動的に開始するサービスを指定する。

    SERVICE_DEMAND_START

 

プロセスが StartService 関数を呼び出したときにサービス制御マネージャが開始するサービスを指定する。

    SERVICE_DISABLED

開始できなくするサービスを指定する。

dwErrorControl
    [入力]起動時にサービスを開始することに失敗した場合のエラーの深刻度を指定し、障害が発生した場合に開始プログラムが実施する

    べき操作を決定する。次のいずれかの値を指定する。

    値                                          

意味                                                                                                                   

    SERVICE_ERROR_IGNORE

開始プログラムはエラーをログに記録しますが、開始操作を続行する。

    SERVICE_ERROR_NORMAL

 

開始プログラムはエラーをログに記録し、メッセージボックスをポップアップ表示しますが、開始操作を続行する。

    SERVICE_ERROR_SEVERE

 

 

開始プログラムはエラーをログに記録する。直前に利用したときは正常であったことがわかっている構成を使って開始操作を行っている場合は、その開始操作を続行する。それ以外の場合、直前に利用したときは正常であった構成を使ってシステムを再起動する。

    SERVICE_ERROR_CRITICAL

 

 

可能であれば、開始プログラムはエラーをログに記録する。直前に利用したときは正常であったことがわかっている構成を使って開始操作を行っている場合は、その開始操作は失敗する。それ以外の場合、直前に利用したときは正常であった構成を使ってシステムを再起動する。

lpBinaryPathName
    [入力]サービスバイナリファイルの完全修飾パスを表す、NULL で終わる文字列へのポインタを指定する。パスの一部に半角スペースが

    使われている場合は、正しく解釈されるように引用符で囲まなければならない。たとえば、"d:\\my share\\myservice.exe" というパス

    は、"\"d:\\my share\\myservice.exe\"" という形で指定しなければならない。
lpLoadOrderGroup
    [入力]このサービスが所属しているロード順序決定グループの名前を表す、NULL で終わる文字列へのポインタを指定する。サービスが

    どのグループにも所属していない場合は、NULL または空文字列を指定する。
lpdwTagId
    [出力]タグ値を受け取る変数へのポインタを指定する。このタグ値は、lpLoadOrderGroup パラメータで指定されたグループで一意の値

    である。既存のタグを変更しない場合は、NULL を指定する。
    次のレジストリキーの GroupOrderList 値でタグ順序ベクタを指定すると、タグを使って、ロード順序決定グループ内でサービスの開始順序

    を決定することができる。
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
    開始タイプが SERVICE_BOOT_START または SERVICE_SYSTEM_START であるドライバサービスでのみ、タグが評価される。
lpDependencies
    [入力]NULL で区切られた複数のサービス名またはロード順序決定グループからなる、2 つの NULL で終わる配列へのポインタを指定

    する。システムはこのサービスを開始する前に、この配列内で列挙されたサービスやグループを開始しておかなければならない。このサービ

    スに依存性がない場合は、NULL または空文字列を指定する。グループに対する依存性とは、そのグループのすべてのメンバを開始しよ

    うと試みた後、そのメンバのうち少なくとも 1 つが動作している状態でのみ、このサービスを実行できることを意味する。
    グループ名のプリフィックスとして SC_GROUP_IDENTIFIER を記述しなければならない。その結果、グループ名とサービス名を区別できる

    ようになる。サービス名とサービスグループ名は同じ名前空間を共有しているからである。
lpServiceStartName
    [入力]サービス名を表す NULL で終わる文字列へのポインタを指定する。サービスタイプが SERVICE_WIN32_OWN_PROCESS であ

    る場合、DomainName\UserName 形式のアカウント名を使いる。サービスプロセスは、このユーザーとしてログオンすることになる。このア

    カウントがビルトインドメインに所属している場合、.\UserName を指定できる。サービスタイプが SERVICE_WIN32_SHARE_PROCESS で

    ある場合、LocalSystem アカウントを指定しなければならない。サービスタイプが SERVICE_WIN32_SHARE_PROCESS である場合、

    LocalSystem アカウントを指定しなければならない。NULL を指定すると、CreateService 関数は LocalSystem アカウントを使う。
    サービスタイプが SERVICE_KERNEL_DRIVER または SERVICE_FILE_SYSTEM_DRIVER である場合、システムがデバイスドライバを

    ロードするために使うドライバオブジェクト名がドライバ名になる。I/O システムが作成した既定のオブジェクト名をドライバ名として使うことを予定

    している場合、NULL を指定する。
    サービスタイプとして SERVICE_INTERACTIVE_PROCESS を指定した場合、そのサービスは LocalSystem アカウントを使って動作しなけ

    ればならない。
lpPassword
    [入力]lpServiceStartName パラメータで指定されたアカウントに対するパスワードを表す、NULL で終わる文字列へのポインタを指定す

    る。このポインタが NULL の場合、またはこのポインタが空文字列を指している場合、サービスにパスワードが割り当てられていないことを

    意味する。ドライバサービスではパスワードは無視される。lpServiceStartName が LocalSystem である場合、パスワードは NULL でなけ

    ればならない。

戻り値
    関数が成功すると、サービスのハンドルが返る。
    関数が失敗すると、NULL が返る。拡張エラー情報を取得するには、 関数を使う。
    サービス制御マネージャは次のエラーコードを設定することがある。サービス制御マネージャが呼び出したレジストリ関数は、その他のエラー

    コードを設定することがある。

    エラーコード                                                

意味                                                                                  

    ERROR_ACCESS_DENIED

 

サービス制御マネージャの指定されたデータベースのハンドルに、SC_MANAGER_CREATE_SERVICE アクセス権がない。

    ERROR_CIRCULAR_DEPENDENCY

サービスの循環依存性が指定された。

    ERROR_DUP_NAME

 

この表示名はサービス制御マネージャのデータベース内に、サービス名または他の表示名としてすでに存在する。

    ERROR_INVALID_HANDLE

サービス制御マネージャの指定されたデータベースのハンドルが無効である。

    ERROR_INVALID_NAME

指定されたサービス名は無効である。

    ERROR_INVALID_PARAMETER

指定されたパラメータは無効である。

    ERROR_INVALID_SERVICE_ACCOUNT

lpServiceStartName パラメータで指定されたユーザーアカウント名は存在しない。

    ERROR_SERVICE_EXISTS

指定されたサービスは、このデータベース内にすでに存在する。


解説
    CreateService 関数は 1 つのサービスオブジェクトを作成し、次のレジストリキーの下にサービス名と同じ名前のキーを作成することにより、

    サービス制御マネージャのデータベース内にそのオブジェクトをインストールする。
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services
    この関数を使って指定した情報は、このキーの下の値として保存される。Setup プログラムとサービス自体により、サービス固有の任意の

    情報をこのキーの下のサブキーとして作成することができる。
    返されるハンドルは、CreateService 関数を呼び出したプロセスにのみ有効である。CloseServiceHandle 関数を呼び出すと、このハンドルを

    閉じることができる。