【解決方法】Windowsサービスでレジストリを読み取る


やあ、
XYNTService プロジェクトを使用してサービスを作成しています。 このサービスが実行されると、このサービス内でプロジェクトを使用して HKEY_CURRENT_USER 内にあるレジストリ値を読み取ります。 レジストリ ラッパー クラス (CRegistry)[^]。 しかし、Windowsサービス内ではそれらを読み取ることができません。 MFC アプリケーションを作成してそのレジストリを読み取ると、それを読み取ることができます。 もう 1 つ、私のサービス XYNTService.exe がタスクマネージャー内で「SYSTEM」として実行されているのが問題なのでしょうか。 それが問題である場合、「管理者」として実行するにはどこを変更すればよいですか [my current user name] XYNTService プロジェクト内。

ありがとう
ラーフル

解決策 1

あなたは正しいです。問題はサービスの実行方法にあります。
問題は次の 2 つの方法で解決できます。

  • ログオンしたユーザーのコンテキストでサービスを実行し、フラグを追加します SERVICE_INTERACTIVE_PROCESS サービスを作成するとき (または、 サービスコントロールマネージャー
  • 特定のユーザーのコンテキストでサービスを実行します。この場合、レジストリ サブツリー HKEY_CURRENT_USER にアクセスすると、現在ログオンしているユーザーのサブツリーではなく、サービスを実行するために選択したアカウントに関連するサブツリーにアクセスすることになります。

解決策 2

私はすでにそのフラグを持っています。 これが私が使用するコードです

SC_HANDLE schService = CreateService
	( 
		schSCManager,	/* SCManager database      */ 
		pName,			/* name of service         */ 
		pName,			/* service name to display */ 
		SERVICE_ALL_ACCESS,        /* desired access          */ 
		SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS , /* service type            */ 
		SERVICE_AUTO_START,      /* start type              */ 
		SERVICE_ERROR_NORMAL,      /* error control type      */ 
		pPath,			/* service's binary        */ 
		NULL,                      /* no load ordering group  */ 
		NULL,                      /* no tag identifier       */ 
		NULL,                      /* no dependencies         */ 
		NULL,                      /* LocalSystem account     */ 
		NULL
		); 

現在のユーザーのコンテキストでサービスを実行するにはどうすればよいですか?

解決策 3

ゆっぴー!! レジストリを読み取れない原因がわかりました。

RegOpenKeyEx または CRegistry::KeyExists で HKEY_CURRENT_USER を指定していたとき、サービスは HKEY_USERS\.default\ 内を検索していました。

なぜそうなるのかはまだわかりませんが、HKEY_USERS\.default\ 内のエントリのみを読み取ることができます。

しかし、HKEY_LOCAL_MACHINE を指定しても、どこを検索するのかはまだわかりません。
ここで気になるのは「どのPCでも同じように動作するのか?」ということです。

私が指定すると

("HKEY_CURRENT_USERS","Softwares\\Microsoft")

次に検索します

中身

HKEY_USERS\.default\Softwares\Microsoft

ありがとう、
ラーフル

解決策 4

Windowsサービスからレジストリを読み取ることもできません –
————————
dim サブキー as string=”key\\subkey”
Microsoft.Win32.RegistryKey としての Dim oeg
oeg = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(“ソフトウェア”, True)
oeg = oReg.CreateSubKey(サブキー)
oeg = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(“ソフトウェア\\” & サブキー)
oeg が何もない場合
Diagnostics.EventLog.WriteEntry(“oeg は何もありません”)
終了する場合
Dim strD As String = oeg.GetValue(“UseSet”, “”).ToString
Diagnostics.EventLog.WriteEntry(strD.tostring)
———–

しかし、oegとstrDayでは何も得られません
Microsoft VS 2010および.Net 4.0.3xxxでWindows 7 Ultimate 64ビットを使用しています。

解決策 5

現在、私のサービスはレジストリに問題なく実行されています。rahul kulshreshtha に感謝します

今、サービスでタイマーを使用する必要があります。 私がやったことは –
– – – – – – – – – -コード – – – –

<small>
Protected Overrides Sub OnStart(ByVal args() As String)
   ...some code..
Reset1:
   Diagnostics.EventLog.WriteEntry("timer start")
   tim1.Enabled = True
   Diagnostics.EventLog.WriteEntry("timer done")
   ...some code .. .
   GoTo Reset1
End Sub

Private Sub tim1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tim1.Tick
   tim1.Enabled = False

   Diagnostics.EventLog.WriteEntry("inside timer")
   ...some code.. calling some other function here
   Diagnostics.EventLog.WriteEntry("quiting to timer")
   tim1.Enabled = true
End Sub
</small>

– – – – – – 終わり – –

そしてイベントログで私は得ます-

————イベントログエントリ–
タイマースタート
タイマー完了
タイマースタート
タイマー完了
タイマースタート
タイマー完了

– – – – – – 終わり – –

tim1_tick() からコードを取得できないことを意味します

—–必要なイベント ログは —-
タイマースタート
インサイドタイマー
タイマー終了
タイマー完了

タイマースタート
インサイドタイマー
タイマー終了
タイマー完了

– – – 終わり – –

タイマーの使い方を教えてください。
Visual Studio 2010 Professionalを備えたWindows 7 Ultimate x64ビットでdotnet 4.0.3.xを使用しています

コメント

タイトルとURLをコピーしました