我需要从插件 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;
}
最佳答案
您无法按照您尝试的方式轻松解决此问题。大多数浏览器可执行文件都会检查现有实例并重用该实例(如果找到)。有一些特定于浏览器的方法可以通过命令行选项来调整或跳过该检查,以便允许您生成第二个进程,但它们是特定于浏览器的,甚至其中一些浏览器比其他浏览器更卡。
例如,使用 --user-data-dir=c:\some\path
调用 chrome.exe
(以管理员身份)将创建一个新的(提升的)第一次调用时实例化,并在后续时间重用它,前提是您在命令行上提供相同的用户数据目录(即使另一个(非提升的)chrome
一直在默认值下运行.)所讨论的路径可以是任何存在的路径(如果不存在,您可以将其创建为空目录),并且它应该是您的路径,而不是与其他应用程序共享。这可能是暂时的。
同样,使用 -no-remote -profile c:\some\path
调用 firefox.exe
(以管理员身份)将在调用时创建一个新的(提升的)实例即使具有标准配置文件的实例已经在运行,但后续调用必须使用不同的配置文件路径,否则 Firefox(与 Chrome 不同)会交互地提示您实际上是在尝试从同一配置文件目录运行多个实例。
从上面可以看出,生成一个具有高度的新浏览器窗口是可能的,但很麻烦且容易出错,这就引出了一个问题:到底是什么 您是否需要在新浏览器中以海拔高度执行? 整个浏览器是否真的需要以海拔高度运行,或者您可以将“需要海拔”功能委托(delegate)给辅助进程(您可以轻松地生成“作为管理员”并通过环回或通过命名管道进行对话,无论您的主机浏览器是什么?)
关于javascript - 如何从代码中以管理员身份运行 Chrome,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13231265/