C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: Windowサービスからキックされるアプリ


(過去ログ 119 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■69624 / inTopicNo.1)  Windowサービスからキックされるアプリ
  
□投稿者/ けんけん (3回)-(2014/01/15(Wed) 11:49:18)

分類:[.NET 全般] 

開発環境:VB2010
OS:WinXP SP3

処理の概要としましては、上記環境にてWindowsサービスを作成しそのサービス内で、上記環境で作成した
Windowsアプリケーションをキックし、Windowsアプリ内でフォルダの存在確認をしております。
現象としましては、Windowsアプリ内でローカルフォルダの存在確認をした場合は、正常にフォルダ有無が取得できて
おりますが、ネットワークパスを指定するとフォルダの有無が取得できません。
※ネットワークドライブ、IP指定、コンピュター名のどれを指定しても取得できません。
別EXEから上記Windowsアプリをキックした場合は、正常にフォルダ有無の取得ができます。
(ネットワークパスのOS:WinXP SP3)

何か原因が考えられるのでしょうか。
下記にソースを記述します。

'↓サービス側↓
Protected Overrides Sub OnStart(ByVal args() As String)
' サービスを開始するコードをここに追加します。このメソッドによって、
' サービスが正しく実行されるようになります
' ProcessStartInfo の新しいインスタンスを生成する
Dim hPsInfo As New System.Diagnostics.ProcessStartInfo()

' 起動するアプリケーションを設定する
hPsInfo.FileName = "HamadaService_EXE.exe"

'' コマンドライン引数を設定する
'hPsInfo.Arguments = (i + 1).ToString

' 新しいウィンドウを作成するかどうかを設定する (初期値 False)
hPsInfo.CreateNoWindow = False

' シェルを使用するかどうか設定する (初期値 True)
hPsInfo.UseShellExecute = True

' 起動できなかった時にエラーダイアログを表示するかどうかを設定する (初期値 False)
hPsInfo.ErrorDialog = False

' アプリケーションを起動する時の動詞を設定する
hPsInfo.Verb = "Open"

' 起動ディレクトリを設定する
hPsInfo.WorkingDirectory = "C:\Development\TEST\HamadaService_EXE\HamadaService_EXE\bin\Debug"

' 起動時のウィンドウの状態を設定する
hPsInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal '通常

' ProcessStartInfo を指定して起動する
System.Diagnostics.Process.Start(hPsInfo)

End Sub
'↑サービス側↑

'↓Windowsアプリ↓
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
Dim strLogPath As String = Path.Combine(My.Application.Info.DirectoryPath, "LOG")
LOG = New OperationLog(strLogPath, "TRUE", 30)
If Not Directory.Exists(strLogPath) Then
Directory.CreateDirectory(strLogPath)
End If
Call LOG.Start()
Call LOG.ScreenStart(Me.Text)

Dim strDir As String = "\\128.167.89.169\R"
'Dim strDir As String = "\\128.167.89.137\共有"
'Dim strDir As String = "V:\"
LOG.Write(1, strDir)
If Directory.Exists(strDir) Then
'If Directory.Exists("C:\hamada") Then
LOG.Write(0, "ファイルあり")
Else
LOG.Write(0, "ファイルなし")
End If


End Sub
'↑Windowsアプリ↑



引用返信 編集キー/
■69625 / inTopicNo.2)  Re[1]: Windowサービスからキックされるアプリ
□投稿者/ shu (466回)-(2014/01/15(Wed) 11:54:34)
No69624 (けんけん さん) に返信

サービス起動ユーザーに該当ネットワークフォルダへのアクセス権が
ないのではないでしょうか?
net useとかAPIでネットワークフォルダアクセスの為に認証をする
必要があると思われます。
引用返信 編集キー/
■69626 / inTopicNo.3)  Re[2]: Windowサービスからキックされるアプリ
□投稿者/ けんけん (4回)-(2014/01/15(Wed) 12:02:21)
No69625 (shu さん) に返信
> ■No69624 (けんけん さん) に返信
>
> サービス起動ユーザーに該当ネットワークフォルダへのアクセス権が
> ないのではないでしょうか?
> net useとかAPIでネットワークフォルダアクセスの為に認証をする
> 必要があると思われます。

ご回答ありがとうございます。
上記Windowsアプリケーションを単体で起動させた場合、フォルダ有無は取得できているのですが
その場合でも認証が必要なのでしょうか。
引用返信 編集キー/
■69627 / inTopicNo.4)  Re[3]: Windowサービスからキックされるアプリ
□投稿者/ shu (467回)-(2014/01/15(Wed) 13:22:21)
No69626 (けんけん さん) に返信

> ご回答ありがとうございます。
> 上記Windowsアプリケーションを単体で起動させた場合、フォルダ有無は取得できているのですが
> その場合でも認証が必要なのでしょうか。
Windowsログインユーザとサービス実行ユーザは異なる可能性が高いのでWindowsログインユーザに
権限があってもサービス実行ユーザには権限がない可能性があります。
引用返信 編集キー/
■69631 / inTopicNo.5)  Re[3]: Windowサービスからキックされるアプリ
□投稿者/ 魔界の仮面弁士 (499回)-(2014/01/15(Wed) 14:10:07)
No69626 (けんけん さん) に返信
> 上記Windowsアプリケーションを単体で起動させた場合、フォルダ有無は取得できているのですが
> その場合でも認証が必要なのでしょうか。

サービスで使用されるアカウントは、何をお使いですか?
http://salaryman-life.blogspot.jp/2011/03/local-system.html


もう一つ。自動起動でサービスを利用する場合、ネットワーク サービスがまだ初期化されておらず、
リモート サーバーの名前を DNS を介して解決できないというケースもあると聞いたことがあります。
引用返信 編集キー/
■69632 / inTopicNo.6)  Re[4]: Windowサービスからキックされるアプリ
□投稿者/ けんけん (5回)-(2014/01/15(Wed) 14:14:52)
No69631 (魔界の仮面弁士 さん) に返信
> ■No69626 (けんけん さん) に返信
>>上記Windowsアプリケーションを単体で起動させた場合、フォルダ有無は取得できているのですが
>>その場合でも認証が必要なのでしょうか。
>
> サービスで使用されるアカウントは、何をお使いですか?
> http://salaryman-life.blogspot.jp/2011/03/local-system.html
>
>
> もう一つ。自動起動でサービスを利用する場合、ネットワーク サービスがまだ初期化されておらず、
> リモート サーバーの名前を DNS を介して解決できないというケースもあると聞いたことがあります。

魔界の仮面弁士 さん
回答ありがとうございます。

アカウントはLocal Systemを使用しております。
サービスについては、現在手動実行で試しております。
引用返信 編集キー/
■69639 / inTopicNo.7)  Re[1]: Windowサービスからキックされるアプリ
□投稿者/ オショウ (120回)-(2014/01/16(Thu) 02:16:55)
No69624 (けんけん さん) に返信

  WinXPだから、動作した・・・
  と言う点を忘れないでください。

  Vista以降なら、Windowsアプリをキックした際、エラーとなる可能性もあります。

  要は、Windowsサービスは、デスクトップウィンドウを持たないので、Windowを持つ
  アプリを起動した場合、ウィンドウ生成段階でエラーとなる場合があります。
  一般的には、コンソールアプリケーションとして作成しますが、何も画面表示を行わ
  ないように作成します。

  あと、Session 0 分離でしょうか・・・
  http://msdn.microsoft.com/ja-jp/library/windows/hardware/gg463353.aspx

  その他としては、先に投稿されておりますアクセス権限の問題です。
  サービスがLocalSystemですので、起動されたプロセスもそれを継承します。
  サービスのログオンユーザーを、デスクトップログインユーザーに変更することは、
  基本、オススメしません。

  ただ、昨今、偽装のプログラムを正しく書くと言う記事を、いろいろ検索しても見当
  たらないのが現状で・・・
  まぁ〜正しく書くならWin32 API 使わないとダメなうえ、そのサービスにデスクトッ
  プへのアクセス許可も与えないといけなくなりますので、かなりオオゴトなプログラ
  ムになってしまいます。

  簡単に・・・とするのであれば、別プロセスを起動せず、サービス上でそのまま実行
  できるようにすれば、サービスの権限設定のみで回避できるようになると思います。

※ 因みに私はサービス上ですべて行うように書いてます。
  正しく権限設定できれば、FileSystemWatcherでの監視も可能になったと記憶していま
  す。

※ WinXP自体、サポートが終わるので、Vista以降でも正常に動作する・・・
  と言う手法を習得されるのが、先々よいのでは・・・と考えます。

以上。参考まで
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -