Powershellからリモート実行したC++のgets関数が正常に動作しない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
keeji.k

Powershellからリモート実行したC++のgets関数が正常に動作しない

#1

投稿記事 by keeji.k » 11年前

いつもお世話になっております。

ローカルPCからpowershellを用いて、サーバ上にあるPowershellをリモート実行した際に、
サーバ上のPowershell内に記載されているC++のgets関数の入力の処理が異常に動作致します。
異常な動作とは、キーボードの待ち受けが発生しないという現象になります。


■環境は以下の通りです。

【ローカル】
Windows 7
Powershell 2.0
【サーバ】
Windows 2008 R2
Powershell 2.0

C++はVisual c++ 2008 ExpressのWin32 コンソールアプリケーションにてビルドしています。


■処理の流れは以下の通りです。
[ローカル]C:\tmp\Local.ps1 ※Powershell

 リモート実行

[サーバー]\\hoge\D:\tmp\ServerP.sp1 ※Powershell

[サーバー]\\hoge\D:\tmp\ServerC.exe ※C++


■問題の切り分けとしては、以下のパターンを検証致しました。

①[ローカル]PS1→リモート実行→[サーバ]PS1→C++ = 異常
②[サーバ]C++ = 正常
③[サーバ]PS1→C++ = 正常
④[ローカル]より直接[サーバ]C++ = 正常
⑤[ローカル]より直接[サーバ]PS1→C++ = 正常

よって、Powershellからリモート実行した際のみに発生する問題だと考えています。


■各ソース
【Local.ps1】
※この3行はサーバへの接続設定。

コード:

$wk_sec_str = ConvertTo-SecureString (パスワード) -AsPlainText -Force                      #パスワードの暗号化
$wk_psc = New-Object System.Management.Automation.PsCredential ((ユーザ名), $wk_sec_str)   #Credential option instance Create
$wk_sess = New-PSSession -ComputerName (\\hoge) -Credential $wk_psc                        #Session Create

#サーバでリモート実行
Invoke-Command -Session $wk_sess -ScriptBlock {D:\tmp\ServerP.sp1}
----------------------------------------------------------

【ServerP.ps1】

コード:

echo "powershellの入力待ちです。Enterを押してください。"
$host.UI.ReadLine()
& D:\tmp\ServerC.exe
echo "powershellに戻ってきた!"
----------------------------------------------------------
【ServerC.exe】

コード:

printf("C++のEXEを実行しました。数値を入力してください。\n");
char str[5];
L1:
gets(str);
if (str == "") {
    printf("未入力です!入力してください!\n");
    goto L1;
}
printf("入力がありました!\n");
return;
----------------------------------------------------------


■画面の動き

現在の画面の遷移といたしましては、以下の通りになります。
[]内の記載は、PowershellからC++のいずれかの動作を示しています。
------------------------------------------------------------
PS C:\tmp>Local.ps1

powershellの入力待ちです。Enterを押してください。[PS1]
(Enterを押下)
C++のEXEを実行しました。数値を入力してください。 [C++]
未入力です!入力してください! [C++]
未入力です!入力してください! [C++]
未入力です!入力してください! [C++]
未入力です!入力してください! [C++]
・・・・(無限ループ)・・・
------------------------------------------------------------

上記の動きでは無く、以下のような動作にしたいと思っています。
------------------------------------------------------------
PS C:\tmp>Local.ps1

powershellの入力待ちです。Enterを押してください。[PS1]
(Enterを押下)
C++のEXEを実行しました。数値を入力してください。 [C++]
123(Enterを押下) [C++] ←入力待ちが発生し、正常に入力できる
入力がありました! [C++]
powershellに戻ってきた! [PS1]
(終了)
------------------------------------------------------------


■質問内容
問題は、リモート実行にあると思いますが、
リモート実行している状態でのgets関数は正常に挙動しなくなるのでしょうか?

正直いって・・・問題の原因の見当がまったくついておりません。
何か問題解決になりそうな情報がありましたらどんな情報でも構いませんので
ご教示頂けないでしょうか?

よろしくお願い致します。


また、当質問はマルチポストになります。
理由としましては、Powershell・C++のどちらの掲示板に投稿しても
結局は両方の投稿する事になると考えたからになります。

各掲示板にて同一のタイトルにて投稿させて頂きました。
タイトル「Powershellからリモート実行したC++のgets関数が正常に動作しない」

<マルチポスト先>
【マイクロソフトの技術情報ポータル】
http://social.technet.microsoft.com/For ... 99dc19de88

【C言語何でも質問掲示板】
http://dixq.net/forum/viewforum.php?f=3


長文で非常に申し訳ないですが、皆様よろしくお願い致します。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: Powershellからリモート実行したC++のgets関数が正常に動作しない

#2

投稿記事 by ISLe » 11年前

TechNetフォーラムのほうで指摘されてますが、接続元との対話を提供している$host.UIはPowerShellの機能です。

キーボード入力が必要なら、Enter-PSSessionで対話型のセッションを開始して、サーバー側のスクリプトを起動する形にする必要があるかと。
Enter-PSSessionで任意のコマンドを自動的に実行する方法は無いみたいなので手動になってしまいますが。

リモート実行でも、getsで入力するものがあらかじめ分かっているなら、プログラムを分割したりコマンドライン引数で取得したりせずとも、リダイレクトで対応できるのではないでしょうか。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: Powershellからリモート実行したC++のgets関数が正常に動作しない

#3

投稿記事 by へにっくす » 11年前

質問と全然違うことで突っ込みますが。。
keeji.k さんが書きました:

コード:

printf("C++のEXEを実行しました。数値を入力してください。\n");
char str[5];
L1:
gets(str);
if (str == "") {
    printf("未入力です!入力してください!\n");
    goto L1;
}
printf("入力がありました!\n");
return;
条件文は何をしたいのでしょうかね?
strの内容を比較してないよ?
文字列を比較するのは文字列比較関数を使わないとだめですよ!!
googleで「C言語 文字列比較」なり検索してください。

上記プログラムで正常に動いていると判断した理由は何でしょうね
そこが聞きたい(-_-)。
written by へにっくす

閉鎖

“C言語何でも質問掲示板” へ戻る