12

C# .Net Framework 1.1 で開発された Windows サービス内から次のコマンド ラインを使用しています。

net use z: \\myComputer\c$

サービスは、「myComputer」のローカル管理者であるドメイン アカウントで実行されています。コードをデバッグすると、エラーは返されませんが、「z:」ドライブがマップされていないことがわかります。コンソール アプリケーションからまったく同じコードを試したところ、正しく動作しました。これを機能させるには、サービスに何を追加する必要がありますか?

私たちが使用しているコードは以下に含まれています。

よろしく、
セルジオ

startInfo.FileName = "net";  
startInfo.Arguments = string.Format(@"use {0}: \\{1}\{2}", driveLetter,
                                    computerName, folder).Trim();  
startInfo.UseShellExecute = false;  
startInfo.RedirectStandardError = true;

proc.EnableRaisingEvents = false;  
proc.StartInfo = startInfo;

proc.Start();

// If there is an error during the mapping of the drive, it will be read
// from the StandardError property which is a StreamReader object and
// be fed into the error output parameter.  
using(StreamReader errorReader = proc.StandardError)  
{  
         string standardError = string.Empty;  
    while((standardError = errorReader.ReadLine()) != null)  
    {  
        error += standardError + " ";  
    }  
}  
proc.WaitForExit();  
4

5 に答える 5

18

http://msdn.microsoft.com/en-us/library/ms685143.aspxから:

リモート リソースにアクセスする必要があるサービス (ま​​たは別のセキュリティ コンテキストで実行されているプロセス) は、Universal Naming Convention (UNC) 名を使用してリソースにアクセスする必要があります。サービスには、リソースにアクセスするための適切な権限が必要です。サーバー側のサービスが RPC 接続を使用する場合、リモート サーバーで委任を有効にする必要があります。

ドライブ文字は、システムに対してグローバルではありません。各ログオン セッションは、A から Z までの独自のドライブ文字セットを受け取ります。したがって、リダイレクトされたドライブは、異なるユーザー アカウントで実行されているプロセス間で共有できません。さらに、サービス (ま​​たは独自のログオン セッション内で実行されているプロセス) は、別のログオン セッション内で確立されたドライブ文字にアクセスできません。

サービスは、マップされたドライブ文字を介してローカル リソースまたはネットワーク リソースに直接アクセスしたり、実行時に net use コマンドを呼び出してドライブ文字をマップしたりしないでください。

于 2008-11-11T19:58:07.697 に答える
1

サービスはログイン ユーザーとして実行されないため、Windows サービス (レジストリの HKEY-CURRENT-USER を含む) からユーザー プロパティにアクセスすることはできません。

マップされたドライブはユーザー設定の一部であるため、手動でレジストリ内のユーザー プロパティを見つけたり、サービスでドライブをマップしたりしない限り、それらをサービスとして使用することはできません。面倒です。

サービスにログイン シーケンス (おそらく .EXE) を実行させる方法について質問することをお勧めします。それはあなたのためにそれをするかもしれません。

これが役に立てば幸いです、アラン。

于 2008-11-11T20:07:23.327 に答える
0

リモートサーバーにログインするのと同じようなことをしていましたが、マップされたドライブ部分はありませんでした。マップされたドライブを使用するのは好きではありません。つまり、プログラムでは、私はいつも便宜上substを使用しています。とにかく、私はただ含めることを確認する必要がありました

use \\server\c$ /user:admin password

または、リモートサーバーにアクセスできるユーザー/パスワードが何であれ、サービスがどのようにログオンしているかは関係ありません。

于 2012-07-25T19:11:19.750 に答える
0

おそらく、ログインに使用するアカウントを指定する必要があります。コマンドプロンプトnet use /?で入力して、コマンドで設定するヘルプを取得します。

于 2008-11-11T19:49:35.093 に答える
0

サービスがローカル ユーザーのコンテキストで実行されていないためだと思われます。私が覚えているように、何年も前から Windows サービスを構成して、「デスクトップと対話する」などのことができます。

于 2008-11-11T19:51:58.647 に答える