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_WIN32_OWN_PROCESSまたはSERVICE_WIN32_SHARE_PROCESSを指定し、サービスが LocalSystem アカウントのコンテキストで実行されている場合は、次の種類を指定することもできます。
値 | 意味 |
---|---|
|
サービスはデスクトップと対話できます。
詳細については、「 対話型サービス」を参照してください。 |
[in] dwStartType
サービス開始オプション。 既存 の開始の種類を 変更しない場合は、SERVICE_NO_CHANGEを指定します。それ以外の場合は、次のいずれかの値を指定します。
値 | 意味 |
---|---|
|
システムの起動中に、サービス 制御マネージャーによってサービスが自動的に開始されました。 |
|
システム ローダーによって起動されたデバイス ドライバー。 この値は、ドライバー サービスに対してのみ指定できます。 |
|
プロセスが StartService 関数を呼び出したときにサービス コントロール マネージャーによって開始されるサービス。 |
|
開始できないサービス。 サービスの開始を試みると、エラー コード がERROR_SERVICE_DISABLED。 |
|
IoInitSystem 関数によって起動されたデバイス ドライバー。 この値は、ドライバー サービスに対してのみ指定できます。 |
[in] dwErrorControl
このサービスの開始に失敗した場合に実行されるエラーとアクションの重大度。 既存 の エラー コントロールを変更しない場合は、SERVICE_NO_CHANGEを指定します。それ以外の場合は、次のいずれかの値を指定します。
[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 を呼び出します。
次のエラー コードは、サービス コントロール マネージャーによって設定される場合があります。 その他のエラー コードは、サービス コントロール マネージャーによって呼び出されるレジストリ関数によって設定される場合があります。
リターン コード | 説明 |
---|---|
|
ハンドルには 、SERVICE_CHANGE_CONFIG アクセス権がありません。 |
|
循環サービスの依存関係が指定されました。 |
|
表示名は、サービス名または別の表示名として、サービス コントローラー マネージャー データベースに既に存在します。 |
|
指定されたハンドルが無効です。 |
|
指定されたパラメーターが無効です。 |
|
アカウント名が存在しないか、既にインストールされているサービスと同じバイナリ ファイルを共有するようにサービスが指定されていますが、インストールされているサービスと同じではないアカウント名を使用します。 |
|
サービスは削除対象としてマークされています。 |
注釈
ChangeServiceConfig 関数は、サービス コントロール マネージャー データベース内の指定されたサービスの構成情報を変更します。 QueryServiceConfig 関数を使用して、現在の構成情報を取得できます。
lpDisplayName を除き、実行中のサービスの構成が変更された場合、サービスが停止するまで変更は有効になりません。 サービスを再起動せずに資格情報を更新するには、 LsaCallAuthenticationPackage 関数を使用します。
セキュリティに関する備考
lpServiceStartName パラメーターを設定すると、サービスのログオン アカウントが変更されます。 これにより、問題が発生する可能性があります。 サービス プリンシパル名 (SPN) を登録した場合は、間違ったアカウントに登録されます。 同様に、ACE を使用してサービスへのアクセスを許可した場合、間違ったアカウントへのアクセス権が付与されるようになります。例
例については、「 サービスの構成の変更」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | winsvc.h (Windows.h を含む) |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |