掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26254

サービス起動時に関して
投稿者---ぽっきー(2006/02/22 15:51:20)


お力をお貸し下さい。

Windowsの管理ツールの中にある「サービス」の新規登録・
実行・削除するプログラムを作っています。

新規登録時には、CreateService()を使用しています。
また、入力画面でサービスを起動するアカウント・パ
スワードを指定してもらい、サービスへ新規に登録しま
す。

実行時には、StartService()の処理が走ります。

新規登録は正常に処理され、サービス内にも登録されてい
るのですが、実行を行うと、今までサービスを起動した事
がないアカウントを登録している場合に限り、実行時のSt
artService()でエラーになってしまいます。

現在は、新規登録の処理を終わった後にサービスを起動し、
新規登録した内容のプロパティから「ログオン」タブを選択
して、「OK」ボタンを押すという処理で回避しているのです
が、この部分をどうにかしてC言語のプログラムで組みたい
と思っています。

参考に新規登録時のCreateService部分と実行時のStartSe
rvice部分を添付します。

---【新規登録:StartService部分】---------------

 CreateService(
   scm, /* 接続のハンドル */
   chServiceName, /* 内部使用のサービス名 */
   chServiceName, /* サービスアプレット */
   SERVICE_ALL_ACCESS, /* 全アクセス権付与 */
   SERVICE_WIN32_OWN_PROCESS,
   SERVICE_DEMAND_START, /* 開始タイプ */
   SERVICE_ERROR_NORMAL, /* エラー深刻度 */
   chSrvanyPath, /* サービス実行ファイル */
   0, /* ロード順序決定グループ */
   0, /* グループID */
   0, /* 登録モジュール前に開始するサービス名 */
   chUserName, /* 入力時に指定したアカウント */
   chPassWd /* 入力時に指定したパスワード */
   );

-------------------------------------------------

---【実行時処理】---------------------------------

 /* サービスのオープン */
 hsvc =
  OpenService(
   hsc,
   chServiceName, /* 該当のサービス名 */
   SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP
  );

 if(StartService(hsvc,NULL,NULL)==FALSE){
  CloseServiceHandle ( hsvc );
  printf("起動失敗\n");
 }

---------------------------------------------------

サービスアカウントの登録方法に関して教えて頂ければ
なんとかなるのでは・・・と思っています。

以上、宜しくお願い致します。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:サービス起動時に関して 26257 wis 2006/02/23 00:59:39


No.26257

Re:サービス起動時に関して
投稿者---wis(2006/02/23 00:59:39)


はじめまして。
>新規登録時には、CreateService()を使用しています。
>また、入力画面でサービスを起動するアカウント・パ
>スワードを指定してもらい、サービスへ新規に登録しま
>新規登録は正常に処理され、サービス内にも登録されてい
>るのですが、実行を行うと、今までサービスを起動した事
>がないアカウントを登録している場合に限り、実行時のSt
>artService()でエラーになってしまいます。

StartServiceの内部はユーザ定義なはずなのですが。。。?
それとも単にマネージャからのサービス起動に失敗するのでしょうか?
だとしてもエラーメッセージは出るはずですよね。。。?
どのようなエラーなのでしょうか?

>現在は、新規登録の処理を終わった後にサービスを起動し、
>新規登録した内容のプロパティから「ログオン」タブを選択
>して、「OK」ボタンを押すという処理で回避しているのです
タブを選択してOKだけで回避できているのですか。。。?
何も変わらない気がしますが。。。

> CreateService(
> OpenService(
これらの関数は拡張エラーをGetLastErrorで取得できます。
本当にStartServiceがエラーを起こしているのかもちょっとわからないですし、まずはエラーをはっきりさせたほうがいいのでは?

#サービスの登録に権限が無かっただけとか。。。



この投稿にコメントする

削除パスワード

No.26258

Re:サービス起動時に関して
投稿者---wis(2006/02/23 01:33:35)


>StartServiceの内部はユーザ定義なはずなのですが。。。?
訂正です。
ServiceMainと間違えていました。
>> CreateService(
>> OpenService(
>これらの関数は拡張エラーをGetLastErrorで取得できます。
>本当にStartServiceがエラーを起こしているのかもちょっとわからないですし、まずはエラーをはっきりさせたほうがいいのでは?

StartServiceも上記の方法でエラーが取得可能です。




この投稿にコメントする

削除パスワード

No.26260

Re:サービス起動時に関して
投稿者---ぽっきー(2006/02/23 11:22:06)


Wis様

ご回答ありがとうございます。

>>StartServiceの内部はユーザ定義なはずなのですが。。。?
>訂正です。
>ServiceMainと間違えていました。
>>> CreateService(
>>> OpenService(
>>これらの関数は拡張エラーをGetLastErrorで取得できます。
>>本当にStartServiceがエラーを起こしているのかもちょっとわからないですし、まずはエラーをはっきりさせたほうがいいのでは?
>

GetLastError関数とFormatMessageを使用してエラー
の内容を見てみました。

内容は、

「ログオンに失敗したため、サービスを開始できませんでした」

とのメッセージ内容でした。

色々調べていくうちに原因を突き止めました。

>>現在は、新規登録の処理を終わった後にサービスを起動し、
>>新規登録した内容のプロパティから「ログオン」タブを選択
>>して、「OK」ボタンを押すという処理で回避しているのです

↑に関して、「パスワードを再入力後に適用ボタンを押す」と
サービスの起動処理が正常に流れる感じです。

ということは、CreateService()の処理で指定したパスワ
ードに対し、何か処理をしなければならないのでしょうか?
例えば暗号化とか・・。
それともサービスにログオンするための権限みたいなもの
があり、それを先に登録してからでないとサービスを起動
できないのでしょうか?
ちなみに、該当のユーザにはAdmin権限を設定しています。

色々と調べて頂き、ご迷惑をおかけ致しますが、宜しくお
願いします。



この投稿にコメントする

削除パスワード

No.26270

Re:サービス起動時に関して
投稿者---wis(2006/02/24 01:01:46)


動作させているWindows環境が不明ですが2000以降であれば、
そのサービスを実行しようとしているアカウントに、
ローカルセキュリティポリシーで「サービスとしてログオン」の
権利を与えてるとかでできるかもしれませんね。。。
#Adminならもう権限もってるのかな。。。

#HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\サービス名
#ObjectNameの値名で値 NT AUTHORITY\LocalService
#とかにしたらできるかも。。。(なんとなくデスガ)

MSDN:サービスのアクセス許可
http://www.microsoft.com/resources/documentation/WindowsServ/2003/standard/proddocs/ja-jp/Default.asp?url=/resources/documentation/windowsserv/2003/standard/proddocs/ja-jp/sys_srv_permissions.asp

C言語とあまり関係なくなりそうですが、もしレジストリの設定で
できればあとはWindowsのAPIつつくだけでいけそうですね。。。
あんまり役に立てそうになくて申し訳ないです。



この投稿にコメントする

削除パスワード

No.26283

Re:サービス起動時に関して
投稿者---ぽっきー(2006/02/24 20:41:42)


Wis様

ご回答ありがとうございます。

>動作させているWindows環境が不明ですが2000以降であれば、
>そのサービスを実行しようとしているアカウントに、
>ローカルセキュリティポリシーで「サービスとしてログオン」の
>権利を与えてるとかでできるかもしれませんね。。。
>#Adminならもう権限もってるのかな。。。
>
>#HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\サービス名
>#ObjectNameの値名で値 NT AUTHORITY\LocalService
>#とかにしたらできるかも。。。(なんとなくデスガ)
>

ある特定のユーザを指定しているので、そのユーザ
で起動しないとだめなので・・・。


>MSDN:サービスのアクセス許可
>http://www.microsoft.com/resources/documentation/WindowsServ/2003/standard/proddocs/ja-jp/Default.asp?url=/resources/documentation/windowsserv/2003/standard/proddocs/ja-jp/sys_srv_permissions.asp
>
>C言語とあまり関係なくなりそうですが、もしレジストリの設定で
>できればあとはWindowsのAPIつつくだけでいけそうですね。。。
>あんまり役に立てそうになくて申し訳ないです。

いやいや、助かってます。
色々調べてみると、リソースキットにntrights.exeという
権限を設定するものがある事を発見しました。
このEXEをsystemコマンドを使って起動すればなんとかなるの
では・・・と思っています。(少し不安ですが)



この投稿にコメントする

削除パスワード

No.26284

Re:サービス起動時に関して
投稿者---wis(2006/02/25 00:59:05)


なるほどリソースキットにも入ってるんですね。
2000系なら以下にもコマンドの記述がありました。

MSサポートオンライン
http://support.microsoft.com/default.aspx?scid=kb;ja;JP279664

サービスのログオン許可の指定は
SeServiceLogonRightを指定するとよさそうですね。
こちらも勉強させてもらいました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧