System.Management.Automationを使用してリモートマシンにアクセスする際サービスアプリケーションからだとユーザー名の前にバックスラッシュがないとエラーになる

dai 20 評価のポイント
2024-04-15T08:33:41.01+00:00

動作環境

Windows10

.NetFramework4.8

VisualStudio2022

PowerShellStandard.Library5.1.1

ローカル、リモートマシンは同じネットワーク上にありドメイン環境ではない

$PSVersionTable                                                       
Name                           Value
----                           -----
PSVersion                      5.1.19041.4170
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.4170
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

事象

C#でサービスアプリケーションを作成しています。

PowerShellStandard.LibraryをNuGetでインストールし、System.Management.Automationを使ってリモートマシンにアクセスして処理をする実装をしたいと思い、下記のコードでテストしていました。

//リモートマシン上のユーザー、パスワードを入力
PSCredential psCredential = new PSCredential("administrator", securePassword);
WSManConnectionInfo connectionInfo = new WSManConnectionInfo();
connectionInfo.ComputerName = "リモートマシンIP";
connectionInfo.Credential = psCredential;

using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
{
	runspace.Open();
	//行いたい処理を記載
}

コンソールアプリケーション上でテストし、問題なさそうだったのでこのコードをサービスアプリケーションにコピーしテストするとrunspace.Open();WinRM は要求を処理できません。Negotiate 認証の使用中にエラー (errorcode 0x8009030d) が発生しました: 指定されたログオン セッションは存在しません。そのセッションは既に終了している可能性があります。 というエラーになってしまいます。 色々試した結果、ユーザー名にバックスラッシュをつける(\administrator)と正常に処理が終わることが確認できました。

解決したい、知りたいこと

  • ユーザー名にバックスラッシュをつけることが正しいのか
  • 正しい場合サービスアプリケーションでユーザー名にバックスラッシュが必要な理由
  • なぜコンソールアプリケーションだと必要ないのか

原因についてお分かりの方、情報をお持ちの方ご教示ください。 不足している情報などあればご指摘ください。

.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
65 件の質問
C#
C#
C 言語ファミリをルーツとし、コンポーネント指向プログラミングのサポートを含む、オブジェクト指向およびタイプセーフのプログラミング言語。
31 件の質問
PowerShell
PowerShell
コマンドライン シェルと関連するスクリプト言語で構成される Microsoft タスク自動化および構成管理フレームワークのファミリ。
23 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. Raina Zhao - MSFT 2,855 評価のポイント Microsoft ベンダー
    2024-04-16T10:15:46.5133333+00:00

    daiさん、こんにちは。

    Microsoft Q&A フォーラムにご投稿くださいましてありがとうございます。

    ユーザー名にバックスラッシュをつけることは、通常、「DOMAIN\username」などのドメインユーザーを指定するために使用されます。ローカルコンピューターでテストする、ローカルコンピューターで管理者のアカウントを使用する場合は、通常、ユーザー名にバックスラッシュをつける必要はありません。

    ただし、リモートコンピューター、特にドメイン以外の環境では、ローカルユーザーを指定するためにユーザー名にバックスラッシュをつける必要があります。これは、リモート コンピューターがローカル ユーザーとドメイン ユーザーのどちらがログインしているかを知る必要があるためです。したがって、バックスラッシュをつけると、ローカルユーザーが指定されていることが確保できます。

    コンソール アプリケーションとサービス アプリケーションの間には、動作環境と認証メカニズムが異なるため、ユーザー資格情報を処理するときに、動作が異なる場合があります。

    コンソール アプリケーションは通常、ユーザーのコンテキストで実行され、ローカル リソースに直接アクセスできるため、ローカル ユーザーにバックスラッシュをつける必要がない場合があります。

    サービス アプリケーションはシステム アカウントで実行される可能性があるため、ローカル ユーザーを明示的に指定する必要があります。

    上記の情報はお役に立てば幸いです。

    どうぞよろしくお願いいたします。


    役に立った回答には「回答を受け入れる」と「いいね!」を押してください。さらに質問がある場合は、「コメント」を追加してください。注意:Q&Aからメール通知を受け取りたい場合には、ドキュメントの手順に基づき、メール通知を有効にしてください。


0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。