几天前,我必须使用ProcessStartInfo以当前用户权限运行Excel,以便为一些需要管理员或当前用户权限的插件添加用户。
new Process{
StartInfo = new ProcessStartInfo{
Verb = "runas",
FileName = @"path/to/app.exe",
Arguments = "-officeexcel",
Domain = domain,
UserName = login,
Password = pa ss,
UseShellExecute = false,
}
}.Start();
因此,我再也不能使用了:
Marshal.GetActiveObject("Excel.Application")
获取excel实例。所以我尝试使用AccessibleObjectFromWindow()的后期绑定:
int hwnd = (int)FindWindow("XLMAIN", null);
if (hwnd != 0)
{
int hwndChild = 0;
EnumChildCallback cb = new EnumChildCallback(EnumChildProc);
EnumChildWindows(hwnd, cb, ref hwndChild);
if (hwndChild != 0)
{
const uint OBJID_NATIVEOM = 0xFFFFFFF0;
Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
ExcelWindow ptr;
int hr = AccessibleObjectFromWindow(hwndChild, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), out ptr);
if (hr >= 0)
{
using (UILanguageHelper fix = new UILanguageHelper())
{
return (Excel.Application)ptr.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, ptr, null);
}
}
}
}
return null;
它工作但我得到的Excel应用程序没有属性,我无法调用任何方法! 我需要在获得升级的Excel实例后运行一些宏!
我做错了什么?
答案 0 :(得分:0)
出于安全原因,您无法与提升模式下启动的应用程序进行交互。
在您的情况下,我认为实现您要求的唯一方法是首先提升您的应用程序(或专门用于此任务的其他小应用程序),然后,您提升的应用程序将轮流运行excel并执行你需要的任务。 Excel将以提升模式运行。
这种设计模式是以最低权限运行您的应用程序。然后提升,在命令行中指定一个"令牌" (无论您使用什么来通过IPC /套接字连接到您的应用程序)。