サービスが使用するネットワークドライブをマップする


213

一部のWindowsサービスが、マップされたネットワークドライブを必要とし、UNCパスを必要としないコードを使用するとします。サービスの開始時にドライブのマッピングをサービスのセッションで利用できるようにするにはどうすればよいですか?サービスユーザーとしてログインして永続的なマッピングを作成しても、実際のサービスのコンテキストではマッピングが確立されません。


6
ForcePushの回答を参照してください。彼の回避策は機能します。
Ubikuity 2011

回答:


44

サービスを変更するか、それをヘルパープロセス内にラップする必要があります。セッション/ドライブアクセスの問題は別として、永続的なドライブマッピングは対話型ログオンでのみ復元され、サービスは通常実行しません。

ヘルパープロセスのアプローチは非常に単純です。ドライブをマップして「実際の」サービスを開始する新しいサービスを作成するだけです。これについて完全に簡単ではない唯一のことは次のとおりです。

  • ヘルパーサービスは、適切なすべてのSCMコマンド(開始/停止など)を実際のサービスに渡す必要があります。実際のサービスがカスタムSCMコマンドを受け入れる場合は、それらも渡すことを忘れないでください(ただし、このようなコマンドを使用するためにエキゾチックなUNCパスを考慮するサービスは期待していません...)

  • 物事は、資格に関して少しトリッキーになるかもしれません。実際のサービスが通常のユーザーアカウントで実行されている場合は、そのアカウントでもヘルパーサービスを実行できます。アカウントがネットワーク共有に適切にアクセスできる限り、すべてが正常に動作するはずです。実際のサービスがLOCALSYSTEMなどで実行されたときにのみ機能する場合、ネットワークドライブをまったく「見る」ことができないか、機能するために資格情報の調整が必要になるため、状況はさらに興味深いものになります。


2
非常に有益です...ログオンスクリプトもインタラクティブログオンセッションに対してのみ実行され、サービスセッションに対しては実行されないと想定しても正しいですか?
VoidPointer 2008年

220

これは自己責任で使用してください。(XPとServer 2008 x64 R2でテストしました)

このハックには、Mark RussinovichによるSysinternalsSuiteが必要です。

ステップ1: 管理者特権のcmd.exeプロンプトを開く(管理者として実行)

ステップ2: PSExec.exeを使用してルートに再度昇格する:SysinternalsSuiteが含まれているフォルダーに移動し、次のコマンドpsexec -i -s cmd.exe を実行 nt authority\systemしますwhoami。これは、プロンプト内にあり、と入力してこれを証明できます。-iドライブのマッピングは、ユーザーと対話する必要があるために必要とされます

手順3: 次のコマンドを使用して、システムアカウントとして永続的にマップされたドライブを作成します。 net use z: \\servername\sharedfolder /persistent:yes

とても簡単です!

警告:このマッピングは、SYSTEMアカウントから作成したときと同じ方法でのみ削除できます。削除する必要がある場合は、手順1と2を実行しますが、手順3のコマンドをに変更しnet use z: /deleteます。

:新しく作成されたマップされたドライブは、このシステムのすべてのユーザーに表示されますが、「切断されたネットワークドライブ(Z :)」として表示されます。名前に騙されないでください。切断されていると主張するかもしれませんが、それは誰にとっても機能します。これが、このハッキングがM $でサポートされていないことを示す方法です。


3
私はこのソリューションを使用しようとしていて、この問題に遭遇しました:マップされたドライブはユーザー(管理者でさえ)に対して切断されているように見えます。助言がありますか?
コンスタンティンBaciu

7
再起動後、マップされたドライブはなくなります。アイデアはありますか?マッピングは保持されますが、ステータスは「使用不可」なので表示されません
Tommy

4
また、再起動後にマッピングが使用できないと表示されます。
Dave Patterson

33
再起動後にnet use z: \\servername\sharedfolderそれを機能させるには、technet.microsoft.com / en-us / library / cc770556.aspxに従って、コンピューターの起動時に実行するだけを含むスクリプトを作成し、これをSYSTEMアカウントとして実行するため、 psexec。
TRS-80

2
誰もが句を使用することが重要であることを付け加えたいと思い/USER:[remotecomp]\[remoteusername] [password]ます(リモートユーザー名の前にリモートコンピューター名とバックスラッシュが付いていない場合、コマンドが正しく機能しないことがあります。ドライブ、誰もがアクセスできるわけではありません。SYSTEMが共有をマウントするそのシステムのユーザーは、その共有のパスワードを知っている必要があります(XPx64でテスト済み)
Kitet

65

私はpsexecを使用したものと同様のソリューションを見つけましたが、追加のツールなしで機能し、再起動後も存続します。

スケジュールされたタスクを追加し、「実行」フィールドに「システム」を挿入して、単純なコマンドでタスクにバッチファイルを指定するだけです

net use z: \servername\sharedfolder /persistent:yes

次に、「システムの起動時に実行」(または同様の方法で、英語版はありません)を選択すると完了です。


何が最初に始まりますか?Windowsサービスまたはこのスケジュールされたタスク?パスが利用できない場合、サービスは最初に終了します。サービスが最後に開始する場合は、これを再構築する必要があります。
トーマス

1
2008 R2でこれを試しましたが、マップされていない切断されたドライブが作成され、同じドライブを開こうとすると、「z:\にアクセスできません。ログオン失敗:不明なユーザー名または不正なパスワードです」と表示されます。しかし、同じbatファイルを手動で実行することで、マップされたドライブを正常に作成することができました。Nyの洞察?
Gopi 2013

1
@Thomas/persistent:yes
Edd

4
なぜそれがスケジュールされたタスクである必要があるのですか?/ persistent:はい、それを維持するのに十分ではありませんか?
スコットスタッフォード

2
@ScottStaffordいいえ/ persistent:Win7以降では、はいでは不十分です。そのスイッチに関係なく、マッピングは再起動後に削除されます。
Eternal21

44

より良い方法は、mklink.exeを使用してシンボリックリンクを使用することです。ファイルシステムにリンクを作成するだけで、どのアプリでも使用できます。http://en.wikipedia.org/wiki/NTFS_symbolic_linkを参照してください


とてもシンプルでうまく機能します。これはファイルシステムの一部であるため、リンクはすべてのアカウントで使用できます。ネットワークリソースへのアクセス権を持つアカウントとしてサービスが実行されていることを確認してください(システムなどには該当しない場合があります)。
ジェレミーフランク

1
これは間違いなく質問に対するより良い答えです、ありがとうございました!
Sten Petrov

3
残念ながら、symリンクがネットワーク共有にアクセスすると、元のスクエアに戻ります
davidfrancis

23

ここに良い答えがあります:https : //superuser.com/a/651015/299678

つまり、シンボリックリンクを使用できます。

mklink /D C:\myLink \\127.0.0.1\c$

1
サービス内からディレクトリを作成しようとした後にアクセス許可エラーが発生した場合はどうなりますか?
tyoc213 2016

これをオフラインでチャットルームに持ち込み、エラーメッセージの詳細を伝えます。おそらく、昇格した権限でコマンドを実行する必要があります。
philu 2017年

@ tyoc213あなたは答えを得ましたか?
Lsakurifaisu

9

「net use」コマンドを使用できます。

var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);

それがサービスで機能しない場合は、WinapiとPInvokeを試してください。 WNetAddConnection2を

編集:明らかに私はあなたを誤解しました-サービスのソースコードを変更することはできませんよね?その場合、私はmdbの提案に従いますが、少しひねりを加えています。ドライブをマップする独自のサービス(マッピングサービスと呼びます)を作成し、このマッピングサービスを最初の(実際に機能している)サービスの依存関係に追加します。これにより、マッピングサービスが開始(およびドライブをマッピング)する前に、作業サービスが開始されなくなります。


このマッピングサービスのセットアップでは、マッピングサービスによって確立されたドライブマッピングは、元のサービスのコンテキストでは利用できないと思いますか?
VoidPointer 2008年

私はそれを<disclaim>すべき</ disclaim>と思います-各winlogonセッションには1つの環境しかありません。
トレブ

コードはサービスで機能します。私はOPと同じ問題でここに来ましたが、私はサービスの作者です。あなたの答えは私の問題を解決しました。
Joe Gayetty 2017年

5

ForcePush、

注意:新しく作成されたマップされたドライブは、このシステムのすべてのユーザーに表示されますが、「切断されたネットワークドライブ(Z :)」として表示されます。名前に騙されないでください。切断されていると主張するかもしれませんが、それは誰にとっても機能します。これが、このハックがM $でサポートされていないことを伝える方法です...

それはすべて共有権限に依存します。共有アクセス許可にEveryoneがある場合、このマップされたドライブには他のユーザーがアクセスできます。ただし、バッチスクリプトで使用した資格情報を持ち、このバッチスクリプトがスタートアップスクリプトに追加された特定のユーザーだけがいる場合、システムアカウントだけが管理者でなくその共有にアクセスできます。したがって、たとえば、スケジュールされたntbackuoジョブを使用する場合は、[別のユーザーとして実行]でシステムアカウントを使用する必要があります。サービスの「次のアカウントでログオン:ローカルシステムアカウント」の場合、機能するはずです。

私がしたこと、起動スクリプトでドライブ文字をマップせずnet use \\\server\share ...、スケジュールされたジョブでUNCパスを使用するだけでした。ログオンスクリプトを追加しました(または、バッチファイルをスタートアップフォルダーに追加します)。同じ共有に、いくつかのドライブ文字でマッピングしnet use Z: \\\...ます。同じ資格情報を使用します。これで、ログに記録されたユーザーは、マップされたドライブを表示してアクセスできます。同じ共有には2つの接続があります。この場合、ユーザーには「ネットワークドライブが切断されました...」という煩わしいメッセージは表示されません。ただし、UNCだけでなくドライブ文字でその共有にアクセスする必要がある場合は、その共有を別のドライブ文字にマップします。たとえば、システムの場合はY、ユーザーの場合はZです。


4

Windowsサービスにネットワークドライブへのアクセスを許可する方法を見つけました。

たとえば、NFSディスクを備えたWindows Server 2012を見てみましょう。

手順1:マウントするバッチファイルを書き込みます。

バッチファイルを書き込みます。例:C:\ mount_nfs.bat

echo %time% >> c:\mount_nfs_log.txt
net use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1

ステップ2:NT AUTHORITY / SYSTEMとしてディスクをマウントします。

「タスクスケジューラ」を開き、新しいタスクを作成します。

  1. 「システムの起動」で「システム」として実行します。
  2. アクションの作成:「C:\ mount_nfs.bat」を実行します。

これら2つの簡単な手順の後、私のWindows ActiveMQサービスは「ローカルシステム」特権で実行され、ログインなしで完全に実行されます。


3

コマンドプロンプトから実行可能ファイルを通常実行しているときにドライブにアクセスできる理由は、uが通常のexeとして実行しているときに、ログオンしたユーザーアカウントでそのアプリケーションを実行しているためです。そして、そのユーザーはネットワークにアクセスする特権を持っています。ただし、実行可能ファイルをサービスとしてインストールする場合、デフォルトでは、タスク管理に表示される場合、「SYSTEM」アカウントで実行されます。また、「システム」にはネットワークリソースにアクセスする権限がないことをご存じかもしれません。

この問題には2つの解決策があります。

  1. すでに上記で指摘したように、ドライブを永続的にマップするため。

  2. 従うことができるもう1つのアプローチがあります。「services.msc」と入力してサービスマネージャーを開くと、サービスにアクセスでき、サービスのプロパティに「ログオン」タブがあり、「システム」以外のアカウントとしてアカウントを指定できます。自分のログオンユーザーアカウントから、または「ネットワークサービス」を通じてサービスを開始します。これを行うと、永続的でない場合でも、サービスは任意のネットワークコンポーネントおよびドライブにアクセスできます。これをプログラムで実現するには、http: //msdn.microsoft.com/en-us/library/ms682450(v = vs.85).aspx で 'CreateService'関数を 調べ、パラメーター 'lpServiceStartName'を 'NTに設定します。 AUTHORITY \ NetworkService '。これにより、「ネットワークサービス」でサービスが開始されます

  3. CreateService()関数のservicetypeパラメータフラグでSERVICE_INTERACTIVE_PROCESSを指定して、サービスをインタラクティブにすることもできますが、Vistaおよび7ではこの機能がサポートされていないため、XPまでしか制限されません。

ソリューションがお役に立てば幸いです。これで問題が解決したかどうかをお知らせください。


1

サービスの実行に使用するユーザーを「システム」から変更したり、システムとしてマッピングを実行するこっそりした方法を見つけたりする必要はありません。

おもしろいことに、これは「at」コマンドを使用することで可能です。ドライブマッピングを1分先にスケジュールするだけで、システムアカウントで実行され、ドライブがサービスから見えるようになります。


サービスは「システム」として実行されません。特定のローカルアカウントで実行するように設定されています。そのアカウントでログインし、永続的なネットワークマッピングを作成し、ログアウトしてサービスを再起動しても、マッピングはサービスで利用できません。
VoidPointer 2008年

1

永続的なドライブに依存する代わりに、使用するたびにドライブをマップ/マップ解除するようにスクリプトを設定できます。

net use Q: \\share.domain.com\share 
forfiles /p Q:\myfolder /s /m *.txt /d -0 /c "cmd /c del @path"
net use Q: /delete

これは私にとってはうまくいきます。


0

私はまだコメントできません(評判に取り組んでいます)が、@ Tech Jerk @ spankmaster79(素敵な名前lol)と@NMCの問題に答えるためにアカウントを作成しました。 psexecは追加のツールなしで動作し、再起動後も存続します。」@ラリーが作った投稿。

これに対する解決策は、ログインしたアカウント内からそのフォルダーを参照することです。つまり、

    \\servername\share  

そして、ログインを促し、UNCに使用したのと同じ資格情報をpsexecに入力します。その後、それは働き始めます。私の場合、これはサービスのあるサーバーが、マッピング先のサーバーと同じドメインのメンバーではないためだと思います。UNCとスケジュールされたタスクの両方がホスト名ではなくIPを参照しているかどうかを考えています

    \\123.456.789.012\share 

それは問題を完全に回避するかもしれません。

ここで十分な担当者ポイントを取得した場合は、代わりにこれを返信として追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.