【问题标题】:Techniques to save files from ActiveX (protected mode IE)从 ActiveX 保存文件的技术(保护模式 IE)
【发布时间】:2012-02-09 15:30:55
【问题描述】:

我有一个 ActiveX。

ActiveX 表示:

  • Internet Explorer
  • 本机二进制代码
  • 从 dll (.ocx) 运行
  • 处于保护模式

用户想要保存一些内容。我想显示一个另存为对话框,然后保存到他们说的位置。

由于托管我的 ActiveX 的进程以完整性级别运行,因此代码无法保存到用户请求的位置。

由于托管我的 ActiveX 的进程在 Internet Explorer 的保护模式下运行,因此代码无法保存到用户请求的位置。

相反,文件被静默保存到用户未请求的位置。

相反,文件被静默保存到最终用户无法找到它们的位置。

对如何处理有什么建议吗?

奖金聊天

用户试图将什么保存到他们的硬盘上?这个问题没关系。但假装:

  • 这是几百兆字节的 3D cad 网格
  • 这是一个 GIS 图像转储
  • 这是一个 PDF
  • 这是一个 PNG
  • 这是一个文本文件

补充阅读

Internet Explorer 的保护模式 api 允许插件显示保存对话框:

IEShowSaveFileDialog(this.Handle, "Eden.3ds", 
      GetUserDocumentsFolder(), null, 
      "3D Studio File|*.3ds|GIS Imagery|*.kvm|Adobe Acrobat File|*.pdf|All Files|*.*|"
      null, 0, 
      OFN_ENABLESIZING | OFN_PATHMUSTEXIST,
      ref destinationPath, ref stateCookie);

然后使用提供的 cookie 保存文件:

IESaveFile(stateCookie, sourcefilename);

sourcefilename 将是我设法保存在某处的文件(这是另一个问题)。

阅读奖励

Understanding and Working in Protected Mode Internet Explorer

Saving Files to the User Profile

某些扩展程序需要将文件保存到特定位置,以便用户或应用程序以后可以找到这些文件。以下步骤显示了如何将文件保存在低完整性位置之外:

在 %userprofile%\AppData\LocalLow 中创建文件的临时版本。文件保存成功后记得删除临时文件。

使用用户配置文件文件夹的位置调用IEShowSaveFileDialog,以提示用户将文件保存在其他位置。如果用户接受 Save As 对话框,IEShowSaveFileDialog 将返回所选的目标文件夹。

使用第 1 步中保存的临时文件的位置调用 IESaveFile

当您执行此操作时,保护模式的用户代理会将文件从临时位置复制到用户选择的位置。

【问题讨论】:

  • 不确定您在问什么...如何规避安全措施?
  • @Yahia 我在问 Internet Explorer 的保护模式 API 在保护模式下是否可以用作应用程序编程接口。我在问如何给用户适当的安全警告,让他们做他们想做的事。
  • 即使通过一些晦涩难懂的解决方法可以做到这一点,我也不会使用它...我会检查一下您想要的行为是否可以通过签名的 ActiveX 实现。
  • 感谢您的更新...您所指的 API 用于“扩展”/“插件”,而不是用于通过网站加载的 ActiveX 对象...甚至需要一些解决方法获得对该 API 的访问权,这些变通办法随时可能被关闭(例如在补丁日)......我会尝试使用签名的 ActiveX 以及可能使用其他一些协议(如 ftp 或 WebDAV)......

标签: internet-explorer protected-mode


【解决方案1】:

Internet Explorer Protected Mode API ActiveX 如何在低权限区域之外保存文件:

  1. 将文件保存到FOLDERID_LocalAppDataLow 文件夹;允许在 IE 中以 Low 完整性级别运行的进程写入:

    String sourceFile = SHGetKnownFolderPath(FOLDERID_LocalAppDataLow)+"\tempcopy.dat";
    SaveToFile(sourceFile);
    
  2. 使用IEShowSaveFileDialog向用户显示保存对话框:

    int stateCookie = 0;
    
    IEShowSaveFileDialog(this.Handle, //hwnd
          "FemaleMesh.3ds", //suggested filename
          SHGetKnownFolder(FOLDERID_Desktop), //suggested save location
          "3D Studio Mesh|*.3ds|All Files|*.*", //save filer
          "3ds", //default extension
          1, //default one-based filter index
          ref destinationFile, 
          ref stateCookie);
    
  3. 指示 IE 将我们的临时文件移动到用户使用 IESaveFile 选择的位置:

    IESaveFile(stateCookie, sourceFile);
    

所以我 正确地认为 IE 保护模式 API 是要使用的 API。我只需要翻译所有的 API 标头,找出导入,编写代码,调试它,测试它,然后我才能弄清楚它 是要使用的正确 API。

注意:您可以通过调用IEIsProtectedModeProcess首先检查IE是否在保护模式下运行来节省一些工作:

Boolean isProtectedMode = IEIsProtectedModeProcess();

奖金聊天

IE 保护模式 API 函数无法在 Internet Explorer 外部运行。

注意:任何代码都会发布到公共领域。无需署名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多