アプリ版:「スタンプのみでお礼する」機能のリリースについて

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)】を選択
     して、『新しいタスクの作成ダイアログ』を開く
}
}

質問者からの補足コメント

  • ①はのエラーは、C#側のエラーではなく、起動エラーです。
    エラー内容は、下記の通りです。

    TOS_ERROR CreateProcess returned 5(アクセスが拒否されました。)

      補足日時:2021/03/19 09:21

A 回答 (8件)

以下の「Windows10 - 管理者権限が必要なアプリを自動起動(スタートアップ)」が参考になるのではないでしょうか。



https://pc-karuma.net/windows-10-task-schedule-w …
    • good
    • 0
この回答へのお礼

普通会員様、重ね重ね誠にありがとうございます。
参考にさせて頂き、役立てていきたいと考えております。
もし、また、わからないことがありましたら、質問を上げたいと考えておりますので、発見された際には、ぜひよろしくお願い申し上げます。
今まで誠にありがとうございました。大切な時間を割いてしまい、誠に申し訳ありませんでした。
普通会員様の今後のご活躍をお祈りしております。

お礼日時:2021/03/20 19:56

理解できるし、合理的です。

もし何か必要なことがあれば、遠慮なく言ってください。できる限り貴方の質問に対応します。

貴方の会社がうまくいくことを願っています。
    • good
    • 0
    • good
    • 0
この回答へのお礼

普通会社員様、ご親切な回答、誠に痛み入ります。
弊社は、従業員6人の小さな会社です。パソコン操作が苦手な従業員も多いので、操作の手間をできるだけ省きたく、今回のソフトを考えたわけです。このソフトをいれるパソコンは機械専用なので、ネットには繋げませんし、操作も限られた従業員のみなので、セキュリティーはあまり気にしておりません。ソフト制作のプロの方からすれば、きっと許せないことでしょう。ですが、ご理解願います。③の方法が無理なら、自作ソフトの操作後に、デスクトップ上のアイコンをクリックするように致します。そもそも自作ソフトの操作後に自動で立ち上がったら、楽だし、カッコいいかなと思って始めた事なのですから。
あまりにも専門的になりすぎてしまい、これ以上、普通会社員様のお手を煩わすわけにはいかないと思い、この文を書きました。

お礼日時:2021/03/19 19:56

③の方法では、実際にアプリケーションを管理者として実行することになります。

会社では、すべてのユーザーが管理者権限を持っていますか?

もう一つの重要な関心事は、セキュリティ・コントロールです。もし、アプリケーションが完全に自社開発されており、サードパーティのライブラリを使用していない場合は、すべてのコンピュータがセキュリティで保護されていれば問題ありませんと思います。
    • good
    • 0

ここでは、ユーザーが管理者でアプリケーションを起動した場合に、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という名前になります。
    • good
    • 0
この回答へのお礼

普通会員様、何度も何度もご丁寧なご説明、ありがとうございます。
誠に恐縮しております。
レベルがかなりあがってしまい、直ぐには理解できそうにないので、まずはお礼を申し上げさせて頂きまして、後程ゆっくり試してみたいと考えております。
今後の為にも、お聞きしたいのですが、私が示しました③の方法は、これよりも難しいのでしょうか?
自社で使用するソフトなので、手段のカッコ良さは必要ないので。
勝手言って申し訳ないのですが、ご教授頂けたら、この上ないです。

お礼日時:2021/03/19 14:07

以下のコードは、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に設定する必要があるかもしれません。
    • good
    • 0

以下にメソッドの例を示します。



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;
}
}
    • good
    • 0
この回答へのお礼

普通会員様、誠にありがとうございました。

私の曖昧な表現( エラー × → 起動エラー )がいけなかったのですが、貴殿が示された方法は、私が質問に書かせて頂いた中の①の方法に相当し、下記のような起動エラーが発生し、起動できません。

TOS_ERROR CreateProcess returned 5(アクセスが拒否されました。)

②の方法ですと、起動はできるのですが、Eding-CNC側の方で、
【 server priority not REALTIME, Please start as administrator 】
という警告が出てしまいます。

唯一、③の方法だと、うまく起動してくれるのが現状なのです。

③の方法である、1⃣と2⃣のコードをご教授頂ければ、幸いでございます。

お礼日時:2021/03/19 09:16

まず最初に、プロジェクトに以下を含める必要があります。



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();
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!