web-dev-qa-db-ja.com

Windowsサービスは 'Windows XPホーム'ホームネットワーク上のファイルにアクセスできません

注:ルーターに接続されたUSBドライブの代わりに、別のWinXpコンピューターを使用することで、問題を再現することができました。同じ正確な問題。つまり、手動で行っている場合はネットワーク経由でファイルにアクセス(および変更)できますが、同じことを行おうとするとWindowsサービスが失敗します。 Visual Studioでプログラムを実行すると、機能します。 Windowsサービスとまったく同じコードを実行すると、失敗します。

共通のネットワークロケーションにアクセスする必要があるWindowsサービスを作成しました。自宅でテストするために、USBドライブをNetgear N600WNDR3400ルーターに接続しました。 USBストレージ設定では、ワークグループ名がワークグループとして表示され、ファイルパスは次のとおりです。

\\ readyshare\USB_Storage

サービスは、そのネットワークフォルダー内のファイルにアクセスできません。何をしようとしても、ファイルが見つからない、またはアクセス許可が拒否されたというエラーが表示されます。 (ファイルは確かに存在します。)ただし、ラップトップ(Win8)から直接これらのファイルにアクセス/変更でき、妻のラップトップ(WinXP)でも同じことができます。サービスはLocal Systemユーザーとして実行されています。

Network Service.\administrator、および.\JaneDoeとして実行してみました。運がない。

Newtworkフォルダーのアクセス許可も変更しようとしましたが、固定されません。たとえば、Everyoneにフルコントロールを与えようとすると、次のようになります。

enter image description here

適用を押すと、前の状態に戻ります。

enter image description here

新しいユーザーを追加しようとしましたが(上記の[追加]ボタンを参照)、次のエラーが発生します。

enter image description here

これを機能させる方法はありますか?このネットワーク上のフォルダーへの読み取り/書き込み(完全でもかまいません)アクセスをサービスに持たせたいだけです。

編集-私はProcess Monitorを使用しましたが、予想どおり、これはエラーです:

enter image description here

より多くの失敗した試み

  • 別のUSBドライブを使用する
  • XPボックスでWindowsファイアウォールを無効にする
  • UNCパスを使用する代わりに、マップされたドライブを使用します

編集-ネットワークファイルにアクセスするためのコード注:ファイルが見つかりません(存在していても)。

private UpdaterManifest GetUpdaterManifest()
{
    string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest");

    if (!File.Exists(filePathAndName))
    {
        // Always hit here
    }
}
4
Bob Horn

したがって、共有にアクセスしたいon XPホームマシンはネットワーク経由で、クライアントはWindows XP HomeまたはWindows8のいずれかでサービスとして実行されていますか?!

これにはいくつかの側面があり、それらを正しく取得する必要がありますall。サービスがSYSTEM(別名LocalSystem)として実行されていると仮定すると、次のことを確認する必要があります。

  1. 共有自体に正しい権限が必要です(Everyoneには適切なACLを設定する必要があります)-これはセキュリティエディタがないため、Windows XP Homeの問題点です(一方、通常の状況では、そもそも権限をいじることさえできず、デフォルトが機能する可能性があることを意味します)... XP割り当てるホーム固有のツール共有権限shrpubwとして実行できます(おそらく「共有...ウィザード」の場合ですか?)。 このリンク を参照してください。
  2. 共有するフォルダまたEveryoneに対する適切な権限が必要です。 -コマンドラインでcaclsを使用してthatを実行できます
  3. 私の経験で最も重要なのは、コンピューターポリシーを適切に設定することです。 残念ながら、これはまさにXPホームで立ち往生している場所です。MSがそのWindowsエディションの機能を意図的に無効にしたためです。
    • これに影響を与える1つのポリシー設定は "ネットワークアクセス:匿名でアクセスできる共有" -これは、HKLM\System\CurrentControlSet\Services\LanmanServer\ParametersNullSessionSharesREG_MULTI_SZ)を操作することでレジストリに手動で設定できると思います...それは複数の値で構成される値。 regeditでは、複数の行として表示されます。 1行で共有の名前を追加します。つまり共有がクライアントからの\\readyshare\USB_Storageの場合、共有名はUSB_Storageです。その後、net stop lanmanserverを実行してからnet start lanmanserverを実行します(このサービスは、Computer Management/MMCではServerと呼ばれます)...
    • それに影響を与える別のポリシーは "ネットワークアクセス:すべてのユーザーのアクセス許可を匿名ユーザーに適用する" -これは100%確信が持てませんが、HKLM\SYSTEM\CurrentControlSet\Control\LSARestrictAnonymousREG_DWORDこのKB記事 )を参照してください。値は0である必要があります(ただし、デフォルトは1です)。この設定で再起動を回避できるかどうかはわかりません。

そしてもう1つ、別の成分が不足している可能性があります。しかし、それは私が実行したソフトウェアで機能し、LANの更新メカニズムを機能させるためにこれを設定する必要があります。


チャット機能のおかげで、インタラクティブにそれを理解しました。 shrpubw(上記の最初のポイントの編集で述べた)を使用して、次のようにトリックを実行しました。

スタートメニューから「実行」を選択します

... shrpubwと入力し、Enterキーを押します。

Run dialog

ウィザードの次のステップにすぐに進みます

...これをスキップ:

Step 1 shrpubw

共有する適切なフォルダをポイントし、共有に名前を付けます

このような:

Step 2

...そして「次へ」に進みます

次のステップの権限として「カスタム」を選択します

ここに:

Step 3

... [カスタム]ボタンをクリックすると、次のように表示されます。

Security Editor

...必要に応じて権限を調整してください。 「Everyone」エンティティは通常、調整したいものです。 XP Homeでは、「ANONYMOUS LOGON」を意味する必要があります。これは、この回答の最初の部分(ポイント3)で指摘された設定の影響を受けます。

権限を保存して、次の手順に進みます。

ウィザードを終了します

... このような:

Last step

...または、ボタンをクリックする前にチェックボックスをオンにして、最初からやり直して別の共有を追加します。

注:上記のポリシー設定がこれにも影響を与える可能性が非常に高いです(ポイント3)。したがって、この手順は「サーバー」(つまり、共有を提供するマシン)でも必要になる可能性があります。

1
0xC0000022L