[ad_1]
やあ、
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を使用しています
[ad_2]
コメント