获得提升的excel流程

时间:2014-04-23 15:54:14

标签: c# excel marshalling

几天前,我必须使用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实例后运行一些宏!

我做错了什么?

1 个答案:

答案 0 :(得分:0)

出于安全原因,您无法与提升模式下启动的应用程序进行交互。

在您的情况下,我认为实现您要求的唯一方法是首先提升您的应用程序(或专门用于此任务的其他小应用程序),然后,您提升的应用程序将轮流运行excel并执行你需要的任务。 Excel将以提升模式运行。

这种设计模式是以最低权限运行您的应用程序。然后提升,在命令行中指定一个"令牌" (无论您使用什么来通过IPC /套接字连接到您的应用程序)。

相关问题