質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Q&A

解決済

1回答

3443閲覧

C#のProcessクラスを利用しているコマンドプロンプト上でlogoffコマンドが認識されない

marusa

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

0グッド

0クリップ

投稿2020/10/29 07:46

編集2020/10/30 00:41

前提・実現したいこと

C#で作成したコンソールアプリケーションから、アプリケーションを実行しているユーザーをログオフさせたい。

発生している問題・エラーメッセージ

実行しているアプリの標準出力です。(コマンドプロンプトの出力をリダイレクトしています。)
プロンプト起動時のメッセージ等一部省略しています。

testApp

1C:\Users...\App>echo "ログオフ" 2"ログオフ" 3 4C:\Users...\App>logoff 5'logoff'は、内部コマンドまたは外部コマンド、 6操作可能なプログラムまたはバッチ ファイルとして認識されていません。

該当のソースコード

C#

1using System; 2using System.Diagnostics; 3 4namespace testApp{ 5 class Program 6 { 7 static void main(string[] args){ 8 ProcessStartInfo procInfo = new ProcessStartInfo 9 { 10 Verb = "RunAs", 11 UseShellExecute = false, 12 FileName = "cmd.exe", 13 RedirectStandardInput = true, 14 }; 15 Process proc = Process.Start(procInfo); 16 proc.StandardInput.WriteLine("echo \"ログオフ\""); 17 proc.StandardInput.WriteLine("logoff"); 18 } 19 } 20}

試したこと

  • cmd.exeをアプリを介さず通常起動(cmd.exeを実行)し、"logoff"コマンドを実行

→ ログオフされた。

  • 管理者権限がないのが問題?

→ プログラム内と、通常起動させたcmd.exeで"whoami"コマンドを実行したところ、同一の出力が得られた。実行者が同じということは管理者権限は無関係?

補足情報(FW/ツールのバージョンなど)

Windows10
VisualStudio 2015

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/10/29 12:04

logoff.exeのフルパス指定したらどうなりますか?
marusa

2020/10/29 12:16

結果は、エラーメッセージに記載されているものと同じメッセージでした(logoffの部分がフルパスに変わったという違いはあります)。 logoffをC:\\Windows\\System32\\logoff.exeに変更して実行を行いました。 念のため、.exeを付けずに実行しましたがそちらも同じ結果です。
marusa

2020/10/29 23:59

processで直接logoff.exeを指定すればいいのでは?と思い試しましたがこちらはExceptionでファイルが見つかりませんでした。
退会済みユーザー

退会済みユーザー

2020/10/30 00:37

×RedirectStandartInput 〇RedirectStandardInput
marusa

2020/10/30 00:41

思いっきりタイポしてましたね、、修正いたしました。
guest

回答1

0

ベストアンサー

試しに提示のソースコードをビルドして実行してみましたが、こちらの環境では正常にログオフできました。(.NET Core 3.1 コンソールアプリ)

ExitWindowsEx API, WMI等でも可能なようですが、こちらではいかがでしょう。
コンピュータの電源切る、システムのシャットダウン、再起動、ログオフする


(追記)
32bit版cmdからは、Sysnativeエイリアスを経由する事でシステム本来(のアーキテクチャ)のディレクトリにアクセス可能なようです。
バッチファイルで32bitプロセスから64bitプロセスを起動する

x86,AnyCPU(32bit優先)ビルドの場合、このようにアクセスすればいけそうです。

C#

1proc.StandardInput.WriteLine("%windir%/Sysnative/logoff");

投稿2020/10/30 00:34

編集2020/10/30 04:59
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marusa

2020/10/30 00:44

別の手段の参考サイトのご紹介ありがとうございます。こちらも試してみます。 radian様の環境では正常にログオフ出来たのが腑に落ちないのですが、プロンプトの仕様上弾かれているという線ではないようなので、調べてみます。 ご回答ありがとうございます。
YAmaGNZ

2020/10/30 02:46

同一ソースを「.NET Framework コンソールアプリ」で動作させるとログオフできないですね。
退会済みユーザー

退会済みユーザー

2020/10/30 04:46

不思議に思ったのでもう少し検証してみましたが、 x86でビルド⇒ログオフできない x64でビルド⇒ログオフできる となりました。 .NET Coreだと、Any CPUで32bit優先のチェックがされていないので動作したのではないかと思われます。
YAmaGNZ

2020/10/30 05:05

確かに64bitビルドでログアウトできました。 試しに32bit版のcmd.exeを起動して、logoffコマンドを実行したらエラーとなりました。 このことからLogoff.exeがどこにあるか確認したところSystem32フォルダにはあり、SysWOW64フォルダには存在しませんでした。 なので、32Bitアプリで実行した際、SysWOW64フォルダにリダイレクトされた結果、Logoff.exeが見つからずにエラーとなっていると思われます。
marusa

2020/10/30 05:41

詳細な検証ありがとうございます! リンク先も読ませていただきました。今回の挙動の理由がまとまっており勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問