一部のWindowsサービスが、マップされたネットワークドライブを必要とし、UNCパスを必要としないコードを使用するとします。サービスの開始時にドライブマッピングをサービスのセッションで使用できるようにするにはどうすればよいですか?サービスユーザーとしてログインして永続的なマッピングを作成しても、実際のサービスのコンテキストでマッピングは確立されません。
13 に答える
これは自己責任で使用してください。(XPおよびServer 2008 x64 R2でテストしました)
このハックには、MarkRussinovichによるSysinternalsSuiteが必要です。
ステップ1: 昇格したcmd.exeプロンプトを開きます(管理者として実行)
ステップ2:
PSExec.exeを使用してルートに再度昇格します。SysinternalsSuiteを含むフォルダーに移動し
psexec -i -s cmd.exe
、プロンプト内にある次のコマンドを実行します。nt authority\system
これは、と入力して証明できますwhoami
。-i
ドライブマッピングはユーザーと対話する必要があるため、これが必要です
ステップ3:
次のコマンドを使用して、永続的にマップされたドライブをSYSTEMアカウントとして作成します
net use z: \\servername\sharedfolder /persistent:yes
とても簡単です!
警告:このマッピングは、作成したのと同じ方法でのみ、SYSTEMアカウントから削除できます。削除する必要がある場合は、手順1と2に従いますが、手順3のコマンドをに変更しnet use z: /delete
ます。
注:新しく作成されたマップされたドライブは、このシステムのすべてのユーザーに表示されますが、「切断されたネットワークドライブ(Z:)」として表示されます。名前にだまされてはいけません。切断されていると主張する場合もありますが、すべての人に有効です。このようにして、このハックがM$でサポートされていないことがわかります。
psexec を使用したものと同様のソリューションを見つけましたが、追加のツールなしで機能し、再起動後も存続します。
スケジュールされたタスクを追加し、「実行者」フィールドに「システム」を挿入し、簡単なコマンドでタスクをバッチ ファイルにポイントするだけです。
net use z: \servername\sharedfolder /persistent:yes
次に、「システムの起動時に実行」を選択します(または同様の方法で、英語版はありません)。これで完了です。
サービスを変更するか、ヘルパー プロセス内にラップする必要があります。セッション/ドライブ アクセスの問題を除けば、永続的なドライブ マッピングは、通常、サービスが実行しない対話型ログオンでのみ復元されます。
ヘルパー プロセスのアプローチは非常に単純です。ドライブをマップして「実際の」サービスを開始する新しいサービスを作成するだけです。これについて完全に自明ではない唯一のことは次のとおりです。
ヘルパー サービスは、適切なすべての SCM コマンド (開始/停止など) を実際のサービスに渡す必要があります。実際のサービスがカスタム SCM コマンドを受け入れる場合は、それらも同様に渡すことを忘れないでください (ただし、UNC パスがエキゾチックであると見なすサービスがそのようなコマンドを使用するとは思いません...)
資格情報に関しては、少しトリッキーになるかもしれません。実際のサービスが通常のユーザー アカウントで実行されている場合は、ヘルパー サービスもそのアカウントで実行できます。アカウントがネットワーク共有への適切なアクセス権を持っている限り、すべて問題ありません。実際のサービスが LOCALSYSTEM またはそのようなものとして実行されている場合にのみ機能する場合、ネットワーク ドライブをまったく「見る」ことができないか、機能させるために資格情報のジャグリングが必要になるため、事態はさらに興味深いものになります。
「net use」コマンドを使用できます。
var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);
それがサービスで機能しない場合は、Winapi と PInvoke WNetAddConnection2を試してください。
編集:明らかに私はあなたを誤解していました-サービスのソースコードを変更することはできませんよね?その場合、 mdbによる提案に従いますが、少しひねりを加えます。ドライブをマップする独自のサービス (マッピング サービスと呼びましょう) を作成し、このマッピング サービスを最初の (実際に動作する) サービスの依存関係に追加します。そうすれば、マッピング サービスが開始される (そしてドライブがマッピングされる) 前に、作業中のサービスが開始されません。
フォースプッシュ、
注: 新しく作成されたマップされたドライブは、このシステムのすべてのユーザーに表示されますが、「切断されたネットワーク ドライブ (Z:)」として表示されます。名前にだまされてはいけません。切断されていると主張するかもしれませんが、誰にとっても機能します。これで、このハックが M$ でサポートされていないことがわかります...
それはすべて共有のアクセス許可に依存します。共有アクセス許可に Everyone がある場合、このマップされたドライブは他のユーザーがアクセスできます。ただし、バッチ スクリプトで使用した資格情報を持つ特定のユーザーのみがいて、このバッチ スクリプトがスタートアップ スクリプトに追加されている場合、システム アカウントのみがその共有にアクセスでき、管理者にもアクセスできません。したがって、たとえば、スケジュールされた ntbackuo ジョブを使用する場合は、「Run as」でシステム アカウントを使用する必要があります。サービスの「ログオン: ローカル システム アカウント」が機能する場合。
私がしたこと、起動スクリプトでドライブ文字をマップせずnet use \\\server\share ...
、スケジュールされたジョブでUNCパスを使用して使用しただけです。net use Z: \\\...
同じ資格情報を使用して、いくつかのドライブ文字を持つ同じ共有へのマッピングを使用して、ログオン スクリプトを追加しました (または、スタートアップ フォルダーにバッチ ファイルを追加するだけです) 。これで、ログインしたユーザーはそのマップされたドライブを表示してアクセスできるようになります。同じ共有に 2 つの接続があります。この場合、ユーザーには煩わしい「ネットワーク ドライブが切断されました ...」というメッセージは表示されません。ただし、UNC だけでなくドライブ文字でその共有にアクセスする必要がある場合は、その共有を別のドライブ文字 (システムの場合は Y、ユーザーの場合は Z など) でマップします。
通常、コマンド プロンプトから実行可能ファイルを実行しているときにドライブにアクセスできる理由は、通常の exe として実行している場合、ログオンしたユーザー アカウントでそのアプリケーションを実行しているためです。そして、そのユーザーはネットワークにアクセスする権限を持っています。ただし、実行可能ファイルをサービスとしてインストールすると、タスク管理で表示される場合、デフォルトで「SYSTEM」アカウントで実行されます。また、'SYSTEM' にはネットワーク リソースにアクセスする権限がないことをご存知かもしれません。
この問題には 2 つの解決策があります。
上ですでに指摘したように、ドライブを永続的にマップするには。
従うことができるもう1つのアプローチがあります。「services.msc」と入力してサービスマネージャーを開くと、サービスに移動できます。サービスのプロパティには、アカウントを「システム」以外のアカウントとして指定できるログオンタブがあります。自分のログオン ユーザー アカウントから、または「ネットワーク サービス」を介してサービスを開始します。これを行うと、永続的でない場合でも、サービスは任意のネットワーク コンポーネントとドライブにアクセスできます。これをプログラムで実現するには、http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx で「CreateService」関数を調べ 、パラメータ「lpServiceStartName」を「NT」に設定します。 AUTHORITY\NetworkService'. これにより、「Network Service」の下でサービスが開始されます
CreateService() 関数の servicetype パラメーター フラグに SERVICE_INTERACTIVE_PROCESS を指定して、サービスをインタラクティブにすることもできますが、Vista および 7 ではこの機能がサポートされていないため、これは XP までのみに制限されます。
解決策がお役に立てば幸いです。これがうまくいったかどうか教えてください。
サービスを実行するユーザーを「システム」から変更したり、マッピングをシステムとして実行するための卑劣な方法を見つけたりすることはできません。
面白いことに、これは「at」コマンドを使用して可能です。ドライブマッピングを1分先にスケジュールするだけで、システムアカウントで実行され、ドライブがサービスに表示されます。
まだコメントすることはできませんが (評判に取り組んでいます)、@Tech Jerk @spankmaster79 (いい名前です笑) と @NMC の問題に答えるためにアカウントを作成しました。 psexec ですが、追加のツールがなくても機能し、再起動しても存続します。」@Larry が作成した投稿。
これに対する解決策は、ログインしたアカウント内からそのフォルダーを参照することです。つまり、次のようになります。
\\servername\share
ログインを求めるプロンプトが表示され、psexec で UNC に使用したのと同じ資格情報を入力します。その後、動作を開始します。私の場合、これは、サービスを提供するサーバーが、マッピング先のサーバーと同じドメインのメンバーではないためだと思います。UNCとスケジュールされたタスクの両方がホスト名ではなくIPを参照するかどうかを考えています
\\123.456.789.012\share
問題を完全に回避できます。
ここで十分な担当者ポイントが得られたら、代わりにこれを返信として追加します.