一部のWindowsサービスが、マップされたネットワークドライブを必要とし、UNCパスを必要としないコードを使用するとします。サービスの開始時にドライブのマッピングをサービスのセッションで利用できるようにするにはどうすればよいですか?サービスユーザーとしてログインして永続的なマッピングを作成しても、実際のサービスのコンテキストではマッピングが確立されません。
一部のWindowsサービスが、マップされたネットワークドライブを必要とし、UNCパスを必要としないコードを使用するとします。サービスの開始時にドライブのマッピングをサービスのセッションで利用できるようにするにはどうすればよいですか?サービスユーザーとしてログインして永続的なマッピングを作成しても、実際のサービスのコンテキストではマッピングが確立されません。
回答:
サービスを変更するか、それをヘルパープロセス内にラップする必要があります。セッション/ドライブアクセスの問題は別として、永続的なドライブマッピングは対話型ログオンでのみ復元され、サービスは通常実行しません。
ヘルパープロセスのアプローチは非常に単純です。ドライブをマップして「実際の」サービスを開始する新しいサービスを作成するだけです。これについて完全に簡単ではない唯一のことは次のとおりです。
ヘルパーサービスは、適切なすべてのSCMコマンド(開始/停止など)を実際のサービスに渡す必要があります。実際のサービスがカスタムSCMコマンドを受け入れる場合は、それらも渡すことを忘れないでください(ただし、このようなコマンドを使用するためにエキゾチックなUNCパスを考慮するサービスは期待していません...)
物事は、資格に関して少しトリッキーになるかもしれません。実際のサービスが通常のユーザーアカウントで実行されている場合は、そのアカウントでもヘルパーサービスを実行できます。アカウントがネットワーク共有に適切にアクセスできる限り、すべてが正常に動作するはずです。実際のサービスがLOCALSYSTEMなどで実行されたときにのみ機能する場合、ネットワークドライブをまったく「見る」ことができないか、機能するために資格情報の調整が必要になるため、状況はさらに興味深いものになります。
これは自己責任で使用してください。(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 $でサポートされていないことを示す方法です。
net use z: \\servername\sharedfolder
それを機能させるには、technet.microsoft.com / en-us / library / cc770556.aspxに従って、コンピューターの起動時に実行するだけを含むスクリプトを作成し、これをSYSTEMアカウントとして実行するため、 psexec。
/USER:[remotecomp]\[remoteusername] [password]
ます(リモートユーザー名の前にリモートコンピューター名とバックスラッシュが付いていない場合、コマンドが正しく機能しないことがあります。ドライブ、誰もがアクセスできるわけではありません。SYSTEMが共有をマウントするそのシステムのユーザーは、その共有のパスワードを知っている必要があります(XPx64でテスト済み)
私はpsexecを使用したものと同様のソリューションを見つけましたが、追加のツールなしで機能し、再起動後も存続します。
スケジュールされたタスクを追加し、「実行」フィールドに「システム」を挿入して、単純なコマンドでタスクにバッチファイルを指定するだけです
net use z: \servername\sharedfolder /persistent:yes
次に、「システムの起動時に実行」(または同様の方法で、英語版はありません)を選択すると完了です。
/persistent:yes
より良い方法は、mklink.exeを使用してシンボリックリンクを使用することです。ファイルシステムにリンクを作成するだけで、どのアプリでも使用できます。http://en.wikipedia.org/wiki/NTFS_symbolic_linkを参照してください。
ここに良い答えがあります:https : //superuser.com/a/651015/299678
つまり、シンボリックリンクを使用できます。
mklink /D C:\myLink \\127.0.0.1\c$
「net use」コマンドを使用できます。
var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);
それがサービスで機能しない場合は、WinapiとPInvokeを試してください。 WNetAddConnection2を
編集:明らかに私はあなたを誤解しました-サービスのソースコードを変更することはできませんよね?その場合、私はmdbの提案に従いますが、少しひねりを加えています。ドライブをマップする独自のサービス(マッピングサービスと呼びます)を作成し、このマッピングサービスを最初の(実際に機能している)サービスの依存関係に追加します。これにより、マッピングサービスが開始(およびドライブをマッピング)する前に、作業サービスが開始されなくなります。
ForcePush、
注意:新しく作成されたマップされたドライブは、このシステムのすべてのユーザーに表示されますが、「切断されたネットワークドライブ(Z :)」として表示されます。名前に騙されないでください。切断されていると主張するかもしれませんが、それは誰にとっても機能します。これが、このハックがM $でサポートされていないことを伝える方法です...
それはすべて共有権限に依存します。共有アクセス許可にEveryoneがある場合、このマップされたドライブには他のユーザーがアクセスできます。ただし、バッチスクリプトで使用した資格情報を持ち、このバッチスクリプトがスタートアップスクリプトに追加された特定のユーザーだけがいる場合、システムアカウントだけが管理者でなくその共有にアクセスできます。したがって、たとえば、スケジュールされたntbackuoジョブを使用する場合は、[別のユーザーとして実行]でシステムアカウントを使用する必要があります。サービスの「次のアカウントでログオン:ローカルシステムアカウント」の場合、機能するはずです。
私がしたこと、起動スクリプトでドライブ文字をマップせずnet use \\\server\share ...
、スケジュールされたジョブでUNCパスを使用するだけでした。ログオンスクリプトを追加しました(または、バッチファイルをスタートアップフォルダーに追加します)。同じ共有に、いくつかのドライブ文字でマッピングしnet use Z: \\\...
ます。同じ資格情報を使用します。これで、ログに記録されたユーザーは、マップされたドライブを表示してアクセスできます。同じ共有には2つの接続があります。この場合、ユーザーには「ネットワークドライブが切断されました...」という煩わしいメッセージは表示されません。ただし、UNCだけでなくドライブ文字でその共有にアクセスする必要がある場合は、その共有を別のドライブ文字にマップします。たとえば、システムの場合はY、ユーザーの場合はZです。
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としてディスクをマウントします。
「タスクスケジューラ」を開き、新しいタスクを作成します。
これら2つの簡単な手順の後、私のWindows ActiveMQサービスは「ローカルシステム」特権で実行され、ログインなしで完全に実行されます。
コマンドプロンプトから実行可能ファイルを通常実行しているときにドライブにアクセスできる理由は、uが通常のexeとして実行しているときに、ログオンしたユーザーアカウントでそのアプリケーションを実行しているためです。そして、そのユーザーはネットワークにアクセスする特権を持っています。ただし、実行可能ファイルをサービスとしてインストールする場合、デフォルトでは、タスク管理に表示される場合、「SYSTEM」アカウントで実行されます。また、「システム」にはネットワークリソースにアクセスする権限がないことをご存じかもしれません。
この問題には2つの解決策があります。
すでに上記で指摘したように、ドライブを永続的にマップするため。
従うことができるもう1つのアプローチがあります。「services.msc」と入力してサービスマネージャーを開くと、サービスにアクセスでき、サービスのプロパティに「ログオン」タブがあり、「システム」以外のアカウントとしてアカウントを指定できます。自分のログオンユーザーアカウントから、または「ネットワークサービス」を通じてサービスを開始します。これを行うと、永続的でない場合でも、サービスは任意のネットワークコンポーネントおよびドライブにアクセスできます。これをプログラムで実現するには、http: //msdn.microsoft.com/en-us/library/ms682450(v = vs.85).aspx で 'CreateService'関数を 調べ、パラメーター 'lpServiceStartName'を 'NTに設定します。 AUTHORITY \ NetworkService '。これにより、「ネットワークサービス」でサービスが開始されます
CreateService()関数のservicetypeパラメータフラグでSERVICE_INTERACTIVE_PROCESSを指定して、サービスをインタラクティブにすることもできますが、Vistaおよび7ではこの機能がサポートされていないため、XPまでしか制限されません。
ソリューションがお役に立てば幸いです。これで問題が解決したかどうかをお知らせください。
サービスの実行に使用するユーザーを「システム」から変更したり、システムとしてマッピングを実行するこっそりした方法を見つけたりする必要はありません。
おもしろいことに、これは「at」コマンドを使用することで可能です。ドライブマッピングを1分先にスケジュールするだけで、システムアカウントで実行され、ドライブがサービスから見えるようになります。
私はまだコメントできません(評判に取り組んでいます)が、@ Tech Jerk @ spankmaster79(素敵な名前lol)と@NMCの問題に答えるためにアカウントを作成しました。 psexecは追加のツールなしで動作し、再起動後も存続します。」@ラリーが作った投稿。
これに対する解決策は、ログインしたアカウント内からそのフォルダーを参照することです。つまり、
\\servername\share
そして、ログインを促し、UNCに使用したのと同じ資格情報をpsexecに入力します。その後、それは働き始めます。私の場合、これはサービスのあるサーバーが、マッピング先のサーバーと同じドメインのメンバーではないためだと思います。UNCとスケジュールされたタスクの両方がホスト名ではなくIPを参照しているかどうかを考えています
\\123.456.789.012\share
それは問題を完全に回避するかもしれません。
ここで十分な担当者ポイントを取得した場合は、代わりにこれを返信として追加します。