ChangeServiceConfigA 関数 (winsvc.h)

サービスの構成パラメーターを変更します。

オプションの構成パラメーターを変更するには、 ChangeServiceConfig2 関数を使用します。

構文

BOOL ChangeServiceConfigA(
  [in]            SC_HANDLE hService,
  [in]            DWORD     dwServiceType,
  [in]            DWORD     dwStartType,
  [in]            DWORD     dwErrorControl,
  [in, optional]  LPCSTR    lpBinaryPathName,
  [in, optional]  LPCSTR    lpLoadOrderGroup,
  [out, optional] LPDWORD   lpdwTagId,
  [in, optional]  LPCSTR    lpDependencies,
  [in, optional]  LPCSTR    lpServiceStartName,
  [in, optional]  LPCSTR    lpPassword,
  [in, optional]  LPCSTR    lpDisplayName
);

パラメーター

[in] hService

サービスへのハンドル。 このハンドルは OpenService 関数または CreateService 関数によって返され、 SERVICE_CHANGE_CONFIG アクセス権が必要です。 詳細については、「 サービス セキュリティとアクセス権」を参照してください。

[in] dwServiceType

サービスの種類。 既存 のサービスの種類を 変更しない場合は、SERVICE_NO_CHANGEを指定します。それ以外の場合は、次のいずれかのサービスの種類を指定します。

意味
SERVICE_FILE_SYSTEM_DRIVER
0x00000002
ファイル システム ドライバー サービス。
SERVICE_KERNEL_DRIVER
0x00000001
ドライバー サービス。
SERVICE_WIN32_OWN_PROCESS
0x00000010
独自のプロセスで実行されるサービス。
SERVICE_WIN32_SHARE_PROCESS
0x00000020
プロセスを他のサービスと共有するサービス。
 

SERVICE_WIN32_OWN_PROCESSまたはSERVICE_WIN32_SHARE_PROCESSを指定し、サービスが LocalSystem アカウントのコンテキストで実行されている場合は、次の種類を指定することもできます。

意味
SERVICE_INTERACTIVE_PROCESS
0x00000100
サービスはデスクトップと対話できます。

詳細については、「 対話型サービス」を参照してください。

[in] dwStartType

サービス開始オプション。 既存 の開始の種類を 変更しない場合は、SERVICE_NO_CHANGEを指定します。それ以外の場合は、次のいずれかの値を指定します。

意味
SERVICE_AUTO_START
0x00000002
システムの起動中に、サービス 制御マネージャーによってサービスが自動的に開始されました。
SERVICE_BOOT_START
0x00000000
システム ローダーによって起動されたデバイス ドライバー。 この値は、ドライバー サービスに対してのみ指定できます。
SERVICE_DEMAND_START
0x00000003
プロセスが StartService 関数を呼び出したときにサービス コントロール マネージャーによって開始されるサービス。
SERVICE_DISABLED
0x00000004
開始できないサービス。 サービスの開始を試みると、エラー コード がERROR_SERVICE_DISABLED
SERVICE_SYSTEM_START
0x00000001
IoInitSystem 関数によって起動されたデバイス ドライバー。 この値は、ドライバー サービスに対してのみ指定できます。

[in] dwErrorControl

このサービスの開始に失敗した場合に実行されるエラーとアクションの重大度。 既存 エラー コントロールを変更しない場合は、SERVICE_NO_CHANGEを指定します。それ以外の場合は、次のいずれかの値を指定します。

意味
SERVICE_ERROR_CRITICAL
0x00000003
スタートアップ プログラムは、可能な場合はイベント ログにエラーを記録します。 最後に確認された正常な構成が現在起動しているものである場合、スタートアップ操作は失敗します。 それ以外の場合は、最後に既知の適切な構成でシステムが再起動されます。
SERVICE_ERROR_IGNORE
0x00000000
スタートアップ プログラムはエラーを無視し、スタートアップ操作を続行します。
SERVICE_ERROR_NORMAL
0x00000001
スタートアップ プログラムは、イベント ログにエラーを記録しますが、起動操作を続行します。
SERVICE_ERROR_SEVERE
0x00000002
スタートアップ プログラムは、イベント ログにエラーを記録します。 最後の既知の良好な構成が開始されている場合、スタートアップ操作は続行されます。 それ以外の場合、システムは最後に既知の適切な構成で再起動されます。

[in, optional] lpBinaryPathName

サービス バイナリ ファイルへの完全修飾パス。 既存のパスを変更しない場合は、NULL を指定します。 パスにスペースが含まれている場合は、正しく解釈されるように引用符で囲む必要があります。 たとえば、"d:\my share\myservice.exe" は ""d:\my share\myservice.exe" として指定する必要があります。

パスには、自動開始サービスの引数を含めることもできます。 たとえば、"d:\myshare\myservice.exe arg1 arg2" などです。 これらの引数は、サービス エントリ ポイント (通常は メイン 関数) に渡されます。

別のコンピューターでパスを指定する場合は、リモート呼び出しで使用されるセキュリティ コンテキストであるため、ローカル コンピューターのコンピューター アカウントから共有にアクセスできる必要があります。 ただし、この要件により、リモート コンピューターの潜在的な脆弱性がローカル コンピューターに影響を与える可能性があります。 そのため、ローカル ファイルを使用することをお勧めします。

[in, optional] lpLoadOrderGroup

このサービスがメンバーであるロード順序付けグループの名前。 既存のグループを変更しない場合は、NULL を指定します。 サービスがグループに属していない場合は、空の文字列を指定します。

スタートアップ プログラムでは、読み込み順序付けグループを使用して、他のグループに対して指定した順序でサービスのグループを読み込みます。 読み込み順序付けグループの一覧は、次のレジストリ キーの ServiceGroupOrder 値に含まれています。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

[out, optional] lpdwTagId

lpLoadOrderGroup パラメーターで指定されたグループ内で一意のタグ値を受け取る変数へのポインター。 既存のタグを変更しない場合は、NULL を指定します。

タグを使用すると、次のレジストリ キーの GroupOrderList 値にタグ順序ベクトルを指定することで、読み込み順序付けグループ内でサービスの起動を順序付けることができます。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control

タグは、SERVICE_BOOT_STARTまたはSERVICE_SYSTEM_START開始の種類を持つドライバー サービスに対してのみ評価されます。

[in, optional] lpDependencies

このサービスを開始する前にシステムが開始する必要がある、サービス名または読み込み順序グループの null で区切られた二重 null で終わる配列へのポインター。 (グループへの依存関係は、グループのすべてのメンバーを開始しようとした後に、グループの少なくとも 1 つのメンバーが実行されている場合に、このサービスを実行できることを意味します)。既存の依存関係を変更しない場合は、NULL を指定します。 サービスに依存関係がない場合は、空の文字列を指定します。

サービスとサービス グループは同じ名前空間を共有するため、サービス名と区別できるように、グループ名の前に SC_GROUP_IDENTIFIER を付ける必要があります。

[in, optional] lpServiceStartName

サービスを実行するアカウントの名前。 既存のアカウント名を変更しない場合は 、NULL を 指定します。 サービスの種類が SERVICE_WIN32_OWN_PROCESSの場合は、 DomainName\UserName という形式でアカウント名を使用します。 サービス プロセスは、このユーザーとしてログオンします。 アカウントが組み込みドメインに属している場合は、.\UserName を指定できます (対応する C/C++ 文字列は ".\\UserName"であることに注意してください)。 詳細については、「 サービス ユーザー アカウント 」と「解説」セクションの警告を参照してください。

共有プロセスは、任意のユーザーとして実行できます。

サービスの種類が SERVICE_KERNEL_DRIVER または SERVICE_FILE_SYSTEM_DRIVERの場合、名前は、システムがデバイス ドライバーの読み込みに使用するドライバー オブジェクト名です。 ドライバーが I/O システムによって作成された既定のオブジェクト名を使用する場合は 、NULL を 指定します。

サービスは、マネージド アカウントまたは仮想アカウントを使用するように構成できます。 サービスがマネージド サービス アカウントを使用するように構成されている場合、名前はマネージド サービス アカウント名です。 サービスが仮想アカウントを使用するように構成されている場合は、NT SERVICE\ServiceName として名前を指定します。 マネージド サービス アカウントと仮想アカウントの詳細については、「 サービス アカウントのステップ バイ ステップ ガイド」を参照してください。

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: マネージド サービス アカウントと仮想アカウントは、Windows 7 および Windows Server 2008 R2 まではサポートされません。

[in, optional] lpPassword

lpServiceStartName パラメーターで指定されたアカウント名のパスワード。 既存のパスワードを変更しない場合は 、NULL を 指定します。 アカウントにパスワードがない場合、またはサービスが LocalService、NetworkService、または LocalSystem アカウントで実行されている場合は、空の文字列を指定します。 詳細については、「 サービス レコード一覧」を参照してください。

lpServiceStartName パラメーターで指定されたアカウント名がマネージド サービス アカウントまたは仮想アカウント名の名前である場合、lpPassword パラメーターは NULL である必要があります。

ドライバー サービスのパスワードは無視されます。

[in, optional] lpDisplayName

アプリケーションがユーザーのサービスを識別するために使用する表示名。 既存の表示名を変更しない場合は NULL を 指定します。それ以外の場合、この文字列の最大長は 256 文字です。 名前は、サービス コントロール マネージャーで大文字と小文字が保持されます。 表示名の比較では、常に大文字と小文字が区別されません。

このパラメーターは、次の形式を使用してローカライズされた文字列を指定できます。

@[path]dllname,-strID

識別子 strID を持つ文字列は dllname から読み込まれます。 パス は省略可能です。 詳細については、「 RegLoadMUIString」を参照してください。

Windows Server 2003 および Windows XP: ローカライズされた文字列は、Windows Vista までサポートされません。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

次のエラー コードは、サービス コントロール マネージャーによって設定される場合があります。 その他のエラー コードは、サービス コントロール マネージャーによって呼び出されるレジストリ関数によって設定される場合があります。

リターン コード 説明
ERROR_ACCESS_DENIED
ハンドルには 、SERVICE_CHANGE_CONFIG アクセス権がありません。
ERROR_CIRCULAR_DEPENDENCY
循環サービスの依存関係が指定されました。
ERROR_DUPLICATE_SERVICE_NAME
表示名は、サービス名または別の表示名として、サービス コントローラー マネージャー データベースに既に存在します。
ERROR_INVALID_HANDLE
指定されたハンドルが無効です。
ERROR_INVALID_PARAMETER
指定されたパラメーターが無効です。
ERROR_INVALID_SERVICE_ACCOUNT
アカウント名が存在しないか、既にインストールされているサービスと同じバイナリ ファイルを共有するようにサービスが指定されていますが、インストールされているサービスと同じではないアカウント名を使用します。
ERROR_SERVICE_MARKED_FOR_DELETE
サービスは削除対象としてマークされています。

注釈

ChangeServiceConfig 関数は、サービス コントロール マネージャー データベース内の指定されたサービスの構成情報を変更します。 QueryServiceConfig 関数を使用して、現在の構成情報を取得できます。

lpDisplayName を除き、実行中のサービスの構成が変更された場合、サービスが停止するまで変更は有効になりません。 サービスを再起動せずに資格情報を更新するには、 LsaCallAuthenticationPackage 関数を使用します。

セキュリティに関する備考

lpServiceStartName パラメーターを設定すると、サービスのログオン アカウントが変更されます。 これにより、問題が発生する可能性があります。 サービス プリンシパル名 (SPN) を登録した場合は、間違ったアカウントに登録されます。 同様に、ACE を使用してサービスへのアクセスを許可した場合、間違ったアカウントへのアクセス権が付与されるようになります。

例については、「 サービスの構成の変更」を参照してください。

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー winsvc.h (Windows.h を含む)
Library Advapi32.lib
[DLL] Advapi32.dll

こちらもご覧ください

ChangeServiceConfig2

CreateService

OpenService

QueryServiceConfig

QueryServiceConfig2

QueryServiceDynamicInformation

サービス アカウントのステップ バイ ステップ ガイド

サービス構成

サービス関数

StartService