2

我需要从插件 dll 代码(VC++)以管理员身份运行 Chrome。
但是如果 chrome 窗口处于活动状态,则新创建的窗口没有获得管理员权限。
我正在从 JavaScript 调用插件 dll 代码。创建新窗口后,我关闭了前一个窗口,但同样的情况。
我需要帮助,因为我的插件需要管理员权限。在 Firefox 的情况下也是如此。
(现在我使用 shellExecute 作为管理员创建一个新窗口)。

代码片段:

在这里,我创建了一个 Firefox 实例(所有浏览器都需要类似)

StartNewInstance(BSTR Address)  
{  
    // TODO: Add your implementation code here  
    MessageBox(0,L"Inside",L"ParentName",0);  
    TCHAR szEXEPath[2048];  
    GetModuleFileName ( NULL, szEXEPath, 2048 );  
    SHELLEXECUTEINFO Shex;  
    ZeroMemory( &Shex, sizeof( SHELLEXECUTEINFO ) );  
    Shex.cbSize = sizeof( SHELLEXECUTEINFO );  
    Shex.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;  
    Shex.lpVerb = L"runas";  
    Shex.lpFile = L"C:\\Program Files\\Mozilla Firefox\\firefox.exe";  
    Shex.nShow = SW_SHOWNORMAL;  
    Shex.lpParameters = Address;  
    ShellExecuteEx( &Shex );  
    return true;  
}
4

1 回答 1

2

您无法以您尝试的方式轻松解决此问题。大多数浏览器可执行文件将检查现有实例并在找到时重用该实例。有一些特定于浏览器的方法可以通过命令行选项调整或跳过该检查,以允许您生成第二个进程,但它们是特定于浏览器的,甚至其中一些浏览器比其他浏览器更卡住。

例如,调用chrome.exe(以管理员身份) with--user-data-dir=c:\some\path将在第一次调用时创建一个新的(提升的)实例,并在随后的时间重用它,前提是您在命令行上提供相同的用户数据目录(即使另一个(非提升)chrome一直以默认值运行。) 有问题的路径可以是任何存在的路径(如果不存在,您可以将其创建为空目录),并且它应该是您的,而不是与其他应用程序共享。它可以是暂时的。

同样,调用firefox.exe(以管理员身份) with-no-remote -profile c:\some\path将在调用时创建一个新的(提升的)实例,即使具有标准配置文件的实例已经在运行,但后续调用必须使用不同的配置文件路径,否则 Firefox(与 Chrome 不同)将交互地抱怨您实际上是在尝试从同一配置文件目录运行多个实例。

您可以从上面看到,生成一个带有海拔的新浏览器窗口是可能的,但很麻烦且容易出错,这就引出了一个问题:在新浏览器中,您究竟需要使用海拔执行什么 整个浏览器是否真的需要以提升运行,或者您可以将“需要提升”功能委托给辅助进程(您可以轻松地以“管理员身份”生成并通过环回或命名管道进行对话,无论您的主机是什么浏览器是?)

于 2012-11-11T05:48:34.083 回答