私は、常にPCに接続されるハードウェアと接続する小さなC#ソフトウェアを開発しました。このソフトウェアは管理者権限を必要とするため、PCの起動時に起動する必要があるので、私はそれを展開する最良の方法を評価しています。管理権限を必要とするC#インストールソフトウェア
インストール中に特定のソフトウェアのUACプロンプトを無効にするインストーラを作成することが理想的です。その特定のソフトウェアが起動するたびにUACプロンプトは表示されません。これは可能でしょうか?可能な選択肢は何ですか?
私は、常にPCに接続されるハードウェアと接続する小さなC#ソフトウェアを開発しました。このソフトウェアは管理者権限を必要とするため、PCの起動時に起動する必要があるので、私はそれを展開する最良の方法を評価しています。管理権限を必要とするC#インストールソフトウェア
インストール中に特定のソフトウェアのUACプロンプトを無効にするインストーラを作成することが理想的です。その特定のソフトウェアが起動するたびにUACプロンプトは表示されません。これは可能でしょうか?可能な選択肢は何ですか?
アプリケーションをインストールするセットアップを作成することはできません。対話型アプリケーションには管理者特権が必要ですが、プロンプトは表示されません。インストールはアプリとは別のものです。あなたはMSIベースのWindowsインストーラセットアップを構築すると仮定すると、
:
ほぼ確実に取り付けるには、インストールするには管理者権限を必要とし、あなたはMSIは、あなたがいることを言わせて、インストールします構築するために使用するツールは、入力を促します高度。
昇格したアプリケーションを作成する方法は、起動時に高度を要求するマニフェストを持たせることです。
マシンが起動したときに文字通りコードを実行したい場合は、サービスとしてインストールする必要があります。他のすべてのメソッド(Runレジストリキー、ProgramメニューのStartupフォルダなど)は、ユーザーがログインすると呼び出されます(システム起動時ではありません)。デバイスで何かをするためのUIが必要な場合は、(サービスはデスクトップとやりとりすることができないため)サービスと通信するWindows UIアプリが必要になります。
起動時に管理者権限でアプリケーションを実行する答えが見つかりました。
基本的に、実行レベルがのタスクを作成しました。最高値はで、トリガーはログオンに設定されています。
私は、このリポジトリにVBでコードが見つかりました:https://bitbucket.org/trparky/start_program_at_startup_without_uac
Sub addTask(taskName As String, taskDescription As String, taskEXEPath As String, taskParameters As String)
taskName = taskName.Trim
taskDescription = taskDescription.Trim
taskEXEPath = taskEXEPath.Trim
taskParameters = taskParameters.Trim
If Not IO.File.Exists(taskEXEPath) Then
MsgBox("Executable path not found.", MsgBoxStyle.Critical, Me.Text)
Exit Sub
End If
Dim taskService As TaskService = New TaskService()
Dim newTask As TaskDefinition = taskService.NewTask
newTask.RegistrationInfo.Description = taskDescription
If chkEnabled.Checked Then newTask.Triggers.Add(New LogonTrigger)
Dim exeFileInfo As New FileInfo(taskEXEPath)
newTask.Actions.Add(New ExecAction(Chr(34) & taskEXEPath & Chr(34), taskParameters, exeFileInfo.DirectoryName))
newTask.Principal.RunLevel = TaskRunLevel.Highest
newTask.Settings.Compatibility = TaskCompatibility.V2_1
newTask.Settings.AllowDemandStart = True
newTask.Settings.DisallowStartIfOnBatteries = False
newTask.Settings.RunOnlyIfIdle = False
newTask.Settings.StopIfGoingOnBatteries = False
newTask.Settings.AllowHardTerminate = False
newTask.Settings.UseUnifiedSchedulingEngine = True
newTask.Settings.ExecutionTimeLimit = Nothing
newTask.Settings.Priority = ProcessPriorityClass.Normal
newTask.Principal.LogonType = TaskLogonType.InteractiveToken
taskService.RootFolder.SubFolders(strTaskFolderName).RegisterTaskDefinition(taskName, newTask)
newTask.Dispose()
taskService.Dispose()
newTask = Nothing
taskService = Nothing
End Sub
だから私がしたすべては、C#にこのコードを翻訳し、テスト
using Microsoft.Win32.TaskScheduler;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CreateTaskTest
{
class Program
{
static void Main(string[] args)
{
addTask();
//deleteTask();
}
static void addTask()
{
// Get the service on the local machine
using (TaskService ts = new TaskService())
{
// Create a new task definition and assign properties
TaskDefinition newTask = ts.NewTask();
newTask.RegistrationInfo.Description = "Rondinelli Morais Create Task";
newTask.Triggers.Add(new LogonTrigger());
newTask.Actions.Add(new ExecAction("C:\\Windows\\regedit.exe"));
newTask.Principal.RunLevel = TaskRunLevel.Highest;
newTask.Principal.LogonType = TaskLogonType.InteractiveToken;
newTask.Settings.Compatibility = TaskCompatibility.V2_1;
newTask.Settings.AllowDemandStart = true;
newTask.Settings.DisallowStartIfOnBatteries = false;
newTask.Settings.RunOnlyIfIdle = false;
newTask.Settings.StopIfGoingOnBatteries = false;
newTask.Settings.AllowHardTerminate = false;
newTask.Settings.UseUnifiedSchedulingEngine = true;
newTask.Settings.Priority = System.Diagnostics.ProcessPriorityClass.Normal;
// Register the task in the root folder
ts.RootFolder.RegisterTaskDefinition(@"Test", newTask);
newTask.Dispose();
ts.Dispose();
}
}
static void deleteTask()
{
using (TaskService ts = new TaskService())
{
var tasks = ts.FindAllTasks(new System.Text.RegularExpressions.Regex(@"Test"));
foreach(var task in tasks){
ts.RootFolder.DeleteTask(task.Name);
}
}
}
}
}
私はregeditを使用していますを作りました.exeは、実行に管理者権限が必要なため、exempleにあります。
タスクを作成してログオフして再度ログインすると、ログオン後にregeditが開いて表示されます。
OBS:作成または削除するには、管理者としてのVisual Studioを実行しているタスクを、または
が、これは誰か
のために働いていた場合、私に教えてください、あなたのプログラムのインストールプロセスでは、このコードを配置するには、あなたはそれを実行している考えがありますWindowsサービスとして? – HABO
正確に管理者権限が必要ですか? – Yegor
@ Yegor気温のようなハードウェア情報を読むには管理者権限が必要です。 @ HABOどうすればWindowsサービスとして動作させることができますか?つまり、通常はサービスはGUIなしでソフトウェアですが、これは単なるWinformアプリケーションです。サービスとしてどのように実行できますか?申し訳ありませんが多分それは愚かな質問ですが、私はそのようなことをしたことがない – xanz