2016-06-20 8 views
0

私は、常にPCに接続されるハードウェアと接続する小さなC#ソフトウェアを開発しました。このソフトウェアは管理者権限を必要とするため、PCの起動時に起動する必要があるので、私はそれを展開する最良の方法を評価しています。管理権限を必要とするC#インストールソフトウェア

インストール中に特定のソフトウェアのUACプロンプトを無効にするインストーラを作成することが理想的です。その特定のソフトウェアが起動するたびにUACプロンプトは表示されません。これは可能でしょうか?可能な選択肢は何ですか?

+2

のために働いていた場合、私に教えてください、あなたのプログラムのインストールプロセスでは、このコードを配置するには、あなたはそれを実行している考えがありますWindowsサービスとして? – HABO

+0

正確に管理者権限が必要ですか? – Yegor

+0

@ Yegor気温のようなハードウェア情報を読むには管理者権限が必要です。 @ HABOどうすればWindowsサービスとして動作させることができますか?つまり、通常はサービスはGUIなしでソフトウェアですが、これは単なるWinformアプリケーションです。サービスとしてどのように実行できますか?申し訳ありませんが多分それは愚かな質問ですが、私はそのようなことをしたことがない – xanz

答えて

0

アプリケーションをインストールするセットアップを作成することはできません。対話型アプリケーションには管理者特権が必要ですが、プロンプトは表示されません。インストールはアプリとは別のものです。あなたはMSIベースのWindowsインストーラセットアップを構築すると仮定すると、

ほぼ確実に取り付けるには、インストールするには管理者権限を必要とし、あなたはMSIは、あなたがいることを言わせて、インストールします構築するために使用するツールは、入力を促します高度。

昇格したアプリケーションを作成する方法は、起動時に高度を要求するマニフェストを持たせることです。

マシンが起動したときに文字通りコードを実行したい場合は、サービスとしてインストールする必要があります。他のすべてのメソッド(Runレジストリキー、ProgramメニューのStartupフォルダなど)は、ユーザーがログインすると呼び出されます(システム起動時ではありません)。デバイスで何かをするためのUIが必要な場合は、(サービスはデスクトップとやりとりすることができないため)サービスと通信するWindows UIアプリが必要になります。

0

起動時に管理者権限でアプリケーションを実行する答えが見つかりました。

基本的に、実行レベルがのタスクを作成しました。最高値はで、トリガーはログオンに設定されています。

私は、このリポジトリに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を実行しているタスクを、または

が、これは誰か

関連する問題