2011-05-07 52 views
3

對於長篇帖子的道歉。我的問題是允許我的用戶將文件關聯分配給我的應用程序的最佳方法是什麼。我已經包括了迄今爲止所獲得的位置,但我一點也不確定我是以正確的方式看待它的。應用程序文件關聯

我的應用程序使用特定的擴展名(.ad2)。它由使用XP,Vista和Win7的用戶運行。我需要全部支持他們。在Vista和Win 7中,這當然需要管理員權限。根據用戶安裝位置的不同,我的可執行文件的位置可能有所不同。我認爲一個好的方法是在安裝時分配關聯。這裏存在的問題是,我的一些用戶不喜歡自動化安裝程序,並且已經有大量的安裝基礎。所以我現在已經消除了。

我想給我的用戶控制他們是否關聯或不那麼的過程中一定要對他們

我認爲是嵌入一些代碼在通過菜單訪問的應用程序的下一個可見。這工作正常,因爲應用程序知道它的安裝位置。但它需要作爲管理員運行(我明白,提升特權適用於整個過程)。但是,用戶需要在運行之前提升權限才能繞過UAC。

我最後一次認爲它從主應用程序菜單項掏出一個新進程,提升了該進程的權限並允許它執行文件關聯。 shelled可執行文件與我的主應用程序位於同一個文件夾中,因此它可以知道主要可執行文件和圖標等內容。

我的偏好是掏出一個新的過程 - 我是對嗎?

謝謝

+2

你知道每個用戶的關聯,不需要提升權限設置? – 2011-05-07 07:42:20

+0

不,我不知道那 – ScruffyDuck 2011-05-07 07:44:48

+0

查看它的網絡。看起來好於在外部安裝時間提高 – 2011-05-07 07:46:20

回答

1

ScruffyDuck提出的解決方案使用自行開發的UAC方法,它與標準設施內置於Windows,開發人員可以使用。

需要管理員權限的應用程序應該被標記爲這樣一個清單:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel 
      level="requireAdministrator" 
      uiAccess="false"/> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

注意:這是不是一個完整的清單,我已刪除比requestedExecutionLevel設置其他的一切。

這樣做意味着應用程序在運行時將顯示UAC提升對話框。

最後,這些都不能幫助非管理員用戶。出於這個原因,我會選擇per-user file associations

0

我回答了我的發現,因爲它可能對他人有用。我聲稱沒有原創性,因爲所有代碼都來自其他代碼。我選擇創建一個單獨的可執行文件來運行文件關聯設置。我從一個菜單項調用該程序:

var proc = new ProcessStartInfo { 
       UseShellExecute = true, 
       WorkingDirectory = Environment.CurrentDirectory, 
       FileName = Path.Combine(Application.StartupPath, "ADEFileAssociator.exe"), 
       Verb = "runas" 
      }; 

try { 
     Process.Start(proc); 
    } 
catch { 
     MessageBox.Show("Failed to start File Associator","Process Error",MessageBoxButtons.OK,MessageBoxIcon.Error); 
     return; 
     } 

此方法在另一個問題的答案中描述,並且正常工作。文件關聯器應用程序雙重檢查用戶使用的操作系統,如果操作系統爲Vista或更高版本,並且該應用程序未以管理員權限啓動,則無法啓動。我這樣做是因爲用戶可以直接運行外部應用程序。我使用的代碼是這樣的:

var safeToRun = true; 
var os = Environment.OSVersion; 
if (os.Version.Major > 5) {//Got Vista or Win7 
    if (!IsElevated) { 
     var message = new StringBuilder(); 
     message.AppendLine("You are running Vista or Win7 and this program "); 
     message.AppendLine("needs to run with Admin Privileges. When the "); 
     message.AppendLine("program closes please right click on the executable"); 
     message.AppendLine("or icon and select 'Run As Administrator'."); 
     message.AppendLine(""); 
     message.AppendLine("The Program will now close."); 
     MessageBox.Show(message.ToString(), "Insufficient Privileges", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     safeToRun = false; 
    } 
} 

if (safeToRun) { 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new MainForm()); 
} 

IsElevated檢查當前權限的:

public static bool IsElevated { 
    get { 
     return new WindowsPrincipal 
      (WindowsIdentity.GetCurrent()).IsInRole 
      (WindowsBuiltInRole.Administrator); 
     } 
} 

再次,這是不是我的代碼,而是從另一個答案。

雖然我確定有人會有更好的方式來做到這一點。我的外部應用程序是WinForm,雖然它可能是一個命令行。

編輯 遵循David的評論和建議我知道這不是一個很好的做事方式。不過,我希望整體問題和答案(特別是David的意見)對其他人有指導意義

+0

你對UAC的處理方法搞砸了。您應該在應用程序的清單中標記應用程序需要提升('requireAdministrator'),並且如果可以提供憑證或系統終止,系統將提升。自己動手這是一個非常糟糕的舉動。 – 2011-05-11 13:52:45

+0

謝謝大衛。我非常感謝您的意見和inout。我已停止嘗試以上述方式工作,並使用「每用戶文件關聯」 – ScruffyDuck 2011-05-23 12:37:31

相關問題