2011-05-07 48 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

相关问题