注:ルーターに接続されたUSBドライブの代わりに、別のWinXpコンピューターを使用することで、問題を再現することができました。同じ正確な問題。つまり、手動で行っている場合はネットワーク経由でファイルにアクセス(および変更)できますが、同じことを行おうとするとWindowsサービスが失敗します。 Visual Studioでプログラムを実行すると、機能します。 Windowsサービスとまったく同じコードを実行すると、失敗します。
共通のネットワークロケーションにアクセスする必要があるWindowsサービスを作成しました。自宅でテストするために、USBドライブをNetgear N600WNDR3400ルーターに接続しました。 USBストレージ設定では、ワークグループ名がワークグループとして表示され、ファイルパスは次のとおりです。
\\ readyshare\USB_Storage
サービスは、そのネットワークフォルダー内のファイルにアクセスできません。何をしようとしても、ファイルが見つからない、またはアクセス許可が拒否されたというエラーが表示されます。 (ファイルは確かに存在します。)ただし、ラップトップ(Win8)から直接これらのファイルにアクセス/変更でき、妻のラップトップ(WinXP)でも同じことができます。サービスはLocal System
ユーザーとして実行されています。
Network Service
、.\administrator
、および.\JaneDoe
として実行してみました。運がない。
Newtworkフォルダーのアクセス許可も変更しようとしましたが、固定されません。たとえば、Everyone
にフルコントロールを与えようとすると、次のようになります。
適用を押すと、前の状態に戻ります。
新しいユーザーを追加しようとしましたが(上記の[追加]ボタンを参照)、次のエラーが発生します。
これを機能させる方法はありますか?このネットワーク上のフォルダーへの読み取り/書き込み(完全でもかまいません)アクセスをサービスに持たせたいだけです。
編集-私はProcess Monitorを使用しましたが、予想どおり、これはエラーです:
より多くの失敗した試み
編集-ネットワークファイルにアクセスするためのコード注:ファイルが見つかりません(存在していても)。
private UpdaterManifest GetUpdaterManifest()
{
string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest");
if (!File.Exists(filePathAndName))
{
// Always hit here
}
}
したがって、共有にアクセスしたいon XPホームマシンはネットワーク経由で、クライアントはWindows XP HomeまたはWindows8のいずれかでサービスとして実行されていますか?!
これにはいくつかの側面があり、それらを正しく取得する必要がありますall。サービスがSYSTEM
(別名LocalSystem
)として実行されていると仮定すると、次のことを確認する必要があります。
Everyone
には適切なACLを設定する必要があります)-これはセキュリティエディタがないため、Windows XP Homeの問題点です(一方、通常の状況では、そもそも権限をいじることさえできず、デフォルトが機能する可能性があることを意味します)... XP割り当てるホーム固有のツール共有権限。 shrpubw
として実行できます(おそらく「共有...ウィザード」の場合ですか?)。 このリンク を参照してください。Everyone
に対する適切な権限が必要です。 -コマンドラインでcacls
を使用してthatを実行できますHKLM\System\CurrentControlSet\Services\LanmanServer\Parameters
値NullSessionShares
(REG_MULTI_SZ
)を操作することでレジストリに手動で設定できると思います...それは複数の値で構成される値。 regedit
では、複数の行として表示されます。 1行で共有の名前を追加します。つまり共有がクライアントからの\\readyshare\USB_Storage
の場合、共有名はUSB_Storage
です。その後、net stop lanmanserver
を実行してからnet start lanmanserver
を実行します(このサービスは、Computer Management/MMCではServer
と呼ばれます)...HKLM\SYSTEM\CurrentControlSet\Control\LSA
値RestrictAnonymous
(REG_DWORD
、 このKB記事 )を参照してください。値は0
である必要があります(ただし、デフォルトは1
です)。この設定で再起動を回避できるかどうかはわかりません。そしてもう1つ、別の成分が不足している可能性があります。しかし、それは私が実行したソフトウェアで機能し、LANの更新メカニズムを機能させるためにこれを設定する必要があります。
チャット機能のおかげで、インタラクティブにそれを理解しました。 shrpubw
(上記の最初のポイントの編集で述べた)を使用して、次のようにトリックを実行しました。
... shrpubw
と入力し、Enterキーを押します。
...これをスキップ:
このような:
...そして「次へ」に進みます
ここに:
... [カスタム]ボタンをクリックすると、次のように表示されます。
...必要に応じて権限を調整してください。 「Everyone」エンティティは通常、調整したいものです。 XP Homeでは、「ANONYMOUS LOGON」を意味する必要があります。これは、この回答の最初の部分(ポイント3)で指摘された設定の影響を受けます。
権限を保存して、次の手順に進みます。
... このような:
...または、ボタンをクリックする前にチェックボックスをオンにして、最初からやり直して別の共有を追加します。
注:上記のポリシー設定がこれにも影響を与える可能性が非常に高いです(ポイント3)。したがって、この手順は「サーバー」(つまり、共有を提供するマシン)でも必要になる可能性があります。