C#で書いている自作プログラムからタスクマネージャーの【ファイル→新しいタスクの実行(N)】のダイアログを開きたいと考えております。
理由は、 Eding-CNCというソフトを起動させたいのですが、
① Process.Startを使用しても、Errorが起こり、立ち上がらない。
② Process.Startで【ファイル名を指定して実行】を起動し、ウインドウハンドル検索後、SendMessageでコマンドを送信( -verb runasを付与 )して起動させようとしても、管理者として起動できない。
③ 新しいタスクの実行(N)で、「このタスクに管理者特権を付与して作成します。」にチェックを入れて起動すると、きちんと起動する。
からです。
そこで、下記のプログラムを組んだのですが、タスクマネージャーの起動、タスクマネージャーのウインドウハンドル、タスクマネージャーのメニューハンドル( ファイル-インデックス番号 0 )の取得まではできたのですが、
1⃣【ファイル】のサブメニューにある【新しいタスクの実行(N)】を選択して、『新しいタスクの作成ダイアログ』を開く方法
2⃣「このタスクに管理者特権を付与して作成します。」にチェックを入れる方法
がわかりません。
ダイアログさえ開ければ、同じようにEditに起動コマンドを送信し、OK-Buttonにクリック操作をSendMessageで送ってあげれば、立ち上がってくれると考えております。
何卒ご教授願います。
ProcessStartInfo pInfo = new ProcessStartInfo();
pInfo.FileName = "taskmgr";
//pInfo.Verb = "RunAs";
pInfo.UseShellExecute = true;
Process.Start(pInfo);
System.Threading.Thread.Sleep(100);
IntPtr hWnd = FindWindow("TaskManagerWindow", "タスク マネージャー");
if (hWnd != IntPtr.Zero)
{
//メニューハンドルをゲット
int MenuhWnd = GetMenu(hWnd.ToInt32());
if (MenuhWnd != 0)
{
//サブメニューのハンドルをゲット 第2引数はインデックス番号
IntPtr SubMenuhWnd = GetSubMenu((IntPtr)MenuhWnd, 0);
ここから、わかりません。
1⃣【ファイル】のサブメニューにある【新しいタスクの実行(N)】を選択
して、『新しいタスクの作成ダイアログ』を開く
}
}
No.8ベストアンサー
- 回答日時:
以下の「Windows10 - 管理者権限が必要なアプリを自動起動(スタートアップ)」が参考になるのではないでしょうか。
https://pc-karuma.net/windows-10-task-schedule-w …
普通会員様、重ね重ね誠にありがとうございます。
参考にさせて頂き、役立てていきたいと考えております。
もし、また、わからないことがありましたら、質問を上げたいと考えておりますので、発見された際には、ぜひよろしくお願い申し上げます。
今まで誠にありがとうございました。大切な時間を割いてしまい、誠に申し訳ありませんでした。
普通会員様の今後のご活躍をお祈りしております。
No.6
- 回答日時:
普通会社員様、ご親切な回答、誠に痛み入ります。
弊社は、従業員6人の小さな会社です。パソコン操作が苦手な従業員も多いので、操作の手間をできるだけ省きたく、今回のソフトを考えたわけです。このソフトをいれるパソコンは機械専用なので、ネットには繋げませんし、操作も限られた従業員のみなので、セキュリティーはあまり気にしておりません。ソフト制作のプロの方からすれば、きっと許せないことでしょう。ですが、ご理解願います。③の方法が無理なら、自作ソフトの操作後に、デスクトップ上のアイコンをクリックするように致します。そもそも自作ソフトの操作後に自動で立ち上がったら、楽だし、カッコいいかなと思って始めた事なのですから。
あまりにも専門的になりすぎてしまい、これ以上、普通会社員様のお手を煩わすわけにはいかないと思い、この文を書きました。
No.5
- 回答日時:
③の方法では、実際にアプリケーションを管理者として実行することになります。
会社では、すべてのユーザーが管理者権限を持っていますか?もう一つの重要な関心事は、セキュリティ・コントロールです。もし、アプリケーションが完全に自社開発されており、サードパーティのライブラリを使用していない場合は、すべてのコンピュータがセキュリティで保護されていれば問題ありませんと思います。
No.4
- 回答日時:
ここでは、ユーザーが管理者でアプリケーションを起動した場合に、requestExecutionLevelが "highestAvailable "であるため、昇格を促すマニフェストファイルのサンプルを示しています。
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
Windowsユーザーアカウント制御レベルを変更する場合は、requestExecutionLevelノードを以下のように置き換えてください。
requestedExecutionLevelノードを以下のいずれかに置き換えてください。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
requestedExecutionLevelノードを指定すると、ファイルおよびレジストリの仮想化が無効になります。
後方互換性のためにファイルとレジストリの仮想化を使用する場合は、requestExecutionLevelノードを削除してください。
requestedExecutionLevelノードを削除してください。
-->
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
このファイルをVisual Studioのプロジェクトに取り込む最も簡単な方法は、「新規アイテムの追加」ダイアログを開き、「一般」テンプレートを選択し、「アプリケーションマニフェストファイル」アイテムを選択することです。これにより、プロジェクトのプロパティ(アプリケーションタブ)に新しく追加されたマニフェストファイルが設定されます。マニフェストファイルはデフォルトでapp.manifestという名前になります。
普通会員様、何度も何度もご丁寧なご説明、ありがとうございます。
誠に恐縮しております。
レベルがかなりあがってしまい、直ぐには理解できそうにないので、まずはお礼を申し上げさせて頂きまして、後程ゆっくり試してみたいと考えております。
今後の為にも、お聞きしたいのですが、私が示しました③の方法は、これよりも難しいのでしょうか?
自社で使用するソフトなので、手段のカッコ良さは必要ないので。
勝手言って申し訳ないのですが、ご教授頂けたら、この上ないです。
No.3
- 回答日時:
以下のコードは、admin権限で現在のアプリを再起動することができます。
if (IsAdministrator() == false)
{
// Restart program and run as admin
var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
startInfo.Verb = "runas";
System.Diagnostics.Process.Start(startInfo);
Application.Current.Shutdown();
return;
}
private static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
次に、ビルド後にexeのマニフェストファイルを変更します。
ビジュアルスタジオでプロジェクトを右クリックし、「追加」→「新しいアプリケーションマニフェストファイル」を選択し、「requireAdministrator」が下記のように設定されるようにファイルを変更します。
<requestedExecutionLevel level="requireAdministrator" uiAccess="true" />
** x86プラットフォーム (Windows 7)でビルドされている場合は、マニフェストのPlatform Targetをx64に変更してください。
**「Single Instance Application」をfalseに設定する必要があるかもしれません。
No.2
- 回答日時:
以下にメソッドの例を示します。
public static int RunProcessAsAdmin(string exeName, string parameters)
{
try {
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = CurrentDirectory;
startInfo.FileName = Path.Combine(CurrentDirectory, exeName);
startInfo.Verb = "runas";
//MLHIDE
startInfo.Arguments = parameters;
startInfo.ErrorDialog = true;
Process process = System.Diagnostics.Process.Start(startInfo);
process.WaitForExit();
return process.ExitCode;
} catch (Win32Exception ex) {
WriteLog(ex);
switch (ex.NativeErrorCode) {
case 1223:
return ex.NativeErrorCode;
default:
return ErrorReturnInteger;
}
} catch (Exception ex) {
WriteLog(ex);
return ErrorReturnInteger;
}
}
普通会員様、誠にありがとうございました。
私の曖昧な表現( エラー × → 起動エラー )がいけなかったのですが、貴殿が示された方法は、私が質問に書かせて頂いた中の①の方法に相当し、下記のような起動エラーが発生し、起動できません。
TOS_ERROR CreateProcess returned 5(アクセスが拒否されました。)
②の方法ですと、起動はできるのですが、Eding-CNC側の方で、
【 server priority not REALTIME, Please start as administrator 】
という警告が出てしまいます。
唯一、③の方法だと、うまく起動してくれるのが現状なのです。
③の方法である、1⃣と2⃣のコードをご教授頂ければ、幸いでございます。
No.1
- 回答日時:
まず最初に、プロジェクトに以下を含める必要があります。
using System.Diagnostics;
以下は、Windowsプロンプトを使わずに、管理者としてプロセスを実行する例です。
Process p = new Process();
p.StartInfo.FileName = Server.MapPath("taskmgr.exe");
p.StartInfo.Arguments = "";
p.StartInfo.UseShellExecute = false; //Windowsプロンプトを使わずに
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.Verb = "runas";
p.Start();
p.WaitForExit();
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Windows 10 ソフトの実行を自動化したいです。 1 2022/10/15 16:09
- Windows 10 タスクマネージャーの設定 2 2022/04/04 07:39
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- ノートパソコン Windows 10 動作改善方法 6 2023/04/26 22:30
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- Microsoft ASP C#からvbsを実行したい 5 2022/11/24 17:31
- デスクトップパソコン タスク、プログラム実行後に自動シャットダウンしたい 3 2023/08/25 18:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
タスクスケジューラからショー...
-
XCOPYでネットワーク越しにコピ...
-
batファイルをアンダグラウンド...
-
バッチファイルについて教えて...
-
Windows7のバッチ処理(at)に...
-
WSH(VBScript)でサーバ上にある...
-
Androidアルバムの画像を消去で...
-
macユーザーです!拡張子「Thum...
-
拡張子はなぜ、大文字と小文字...
-
ひとつのファイルを一括で複数...
-
エクセルでの計算式もしくはシ...
-
Windowsフォルダ内のファイルと...
-
XCOPYで指定したフォルダとファ...
-
ドナルドウズを消す。
-
iPhoneのメモ帳が重いです。メ...
-
ファイルの開き方(拡張子なし)
-
softonicという物をダウンロー...
-
Windows10 で登録した外字を他...
-
起動ドライブ"C"直下に現れた"O...
-
フォルダの並び替えの項目を固...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XCOPYでネットワーク越しにコピ...
-
タスクスケジューラからショー...
-
eclipse の TasksにTODO が出ない
-
batファイルをアンダグラウンド...
-
タスクの相関図のわかりやすい...
-
タスクマネージャーの状態の取...
-
一定間隔でメール送信
-
cgiを使ったページが表示さ...
-
ログイン前にタスクにて実行し...
-
バッチファイルで、プログラム...
-
リエントラント関数
-
username以外でログイン名を知...
-
タスクやプロセス管理について
-
バッチファイルからメール作成...
-
UACの権限昇格の確認ダイアログ...
-
常駐PGの作成方法って?
-
VisualStudioで静的コードチェ...
-
タスク、プログラム実行後に自...
-
Vbscriptでアプリ(ソフト)など,...
-
Apache2のインストールが正常に...
おすすめ情報
①はのエラーは、C#側のエラーではなく、起動エラーです。
エラー内容は、下記の通りです。
TOS_ERROR CreateProcess returned 5(アクセスが拒否されました。)