C# 获取提升的excel进程
几天前,为了使用一些需要管理员或当前用户权限的加载项,我必须使用ProcessStartInfo以当前用户权限运行ExcelC# 获取提升的excel进程,c#,excel,marshalling,C#,Excel,Marshalling,几天前,为了使用一些需要管理员或当前用户权限的加载项,我必须使用ProcessStartInfo以当前用户权限运行Excel new Process{ StartInfo = new ProcessStartInfo{ Verb = "runas", FileName = @"path/to/app.exe", Arguments = "-officeexcel", Domain = domain,
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()使用后期绑定:
它工作了,但是我得到的Excel应用程序没有属性,我不能调用任何方法!
我需要在升级Excel实例后运行一些宏
我做错了什么?出于安全原因,无法与以提升模式从非提升模式启动的应用程序交互 在您的情况下,我认为实现您要求的唯一方法是首先提升您的应用程序(或另一个专用于此任务的小应用程序),然后,您提升的应用程序将依次运行excel并执行您需要的任务。Excel将以提升模式运行
这样的设计模式是以所需的最低权限运行应用程序。然后提升,在命令行中指定一个“令牌”(可以通过IPC/sockets连接到应用程序的任何令牌)。我已经编辑了您的标题。请看,“,其中的共识是“不,他们不应该”。你为什么要首先对此进行反思?
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;