パラメータ
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 関数を呼び出すと、このハンドルを
閉じることができる。
|