【问题标题】:Windows Security Message when opening file打开文件时的 Windows 安全消息
【发布时间】:2016-01-19 19:21:07
【问题描述】:

我有一个带有 webBrowser 控件的 Windows 窗体桌面应用程序。我导航到服务器上的一个目录webBrowser1.Navigate(new Uri("\\\\srvername\\share\\directory\\")) 以允许用户从该目录打开文件。

当他们双击文件时,他们每次都会收到一条 Windows 安全消息。

当他们单击“确定”时,文件会根据需要打开。

如果我设置导航到本地目录 webBrowser1.Navigate(new Uri("C:\\Temp\\")); 我没有收到消息。

是否有一种程序化的方式来防止显示此内容,或者是否必须将其作为受信任的站点添加到浏览器中?我们网络上的标准用户无权添加受信任的站点。我尝试在 IE 的本地 Intranet 部分中检查“包括所有网络路径 UNC”。

我试过了

webBrowser1.ScriptErrorsSuppressed = true;

但这不起作用,因为它似乎意味着控件中显示的网页发生脚本错误。

【问题讨论】:

  • 小提示,你可以在你的字符串前加上@,这样就不必转义每个反斜杠。例如new Uri(@"C:\Temp\");至于您的问题,我不相信您可以在不更改安全设置的情况下抑制 Windows 安全消息。

标签: c# webbrowser-control windows-security browser-security security-warning


【解决方案1】:

好吧,我为我的问题找到了两个解决方案。

有可能吗?正如@jacob 和我所有的研究所表明的那样,我认为不是。如果您打算使用 webBrowser 控件查看本地或 UNC 路径,则必须更改 IE 安全性或处理每个打开文件的消息。

结果 #1
更改 IE 中的安全设置。我的组织已锁定所有内容,因此只能通过组策略更改 IE 设置。

  1. 通过所需域 OU 的组策略将 file://servername/* 添加到 Intranet 区域。
  2. 通过所需域 OU 的组策略启用 IE 设置“在 IFRAME 中启动应用程序和文件”策略。

结果 #2
将我的应用程序中的 webBrowser 控件替换为可以完成相同功能的其他控件。这是我使用的一个,因此我可以更好地控制文件和目录的所有工作。我也不必担心安全设置和组策略实施是否正确且工作正常。我也不必担心这些领域的变化会影响我。

Here is the article I used to get started

演练效果很好。在将其集成到我的项目中之前,我在一个一次性项目中完成了它。我需要改变一些东西以适应我。这是我的代码,因为它结束了。我做了一些更改并添加了一些选择/单击事件。

    Boolean FocusTreeview = false;

    public frmMain()
    {
        InitializeComponent();
        treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);
    }

    // Start by calling this.
    private void PopulateTreeView()
    {
        TreeNode rootNode;

        treeView1.Nodes.Clear();
        listView1.Items.Clear();

        DirectoryInfo info = new DirectoryInfo("Pass the root folder here.");

        // Add the root directory.
        if (info.Exists)
        {
            rootNode = new TreeNode(info.Name);
            rootNode.Tag = info;
            GetDirectories(info.GetDirectories(), rootNode);
            treeView1.Nodes.Add(rootNode);
            treeView1.Nodes[0].Expand();
            // This selects the root directory
            NodeSelect(rootNode);
        }
    }

    /********************************************/

    private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
    {
        // This will list all the directories and subdirectories
        TreeNode aNode;
        DirectoryInfo[] subSubDirs;
        foreach (DirectoryInfo subDir in subDirs)
        {
            aNode = new TreeNode(subDir.Name, 0, 0);
            aNode.Name = subDir.ToString();
            aNode.Tag = subDir;
            aNode.ImageKey = "Directory";
            subSubDirs = subDir.GetDirectories();
            if (subSubDirs.Length != 0)
            {
                GetDirectories(subSubDirs, aNode);
            }
            nodeToAddTo.Nodes.Add(aNode);
        }
    }

    /********************************************/

    private void NodeSelect(TreeNode newSelected)
    {
        //Load all the files and directorys in the selected node from the treeview
        listView1.Items.Clear();
        DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
        ListViewItem.ListViewSubItem[] subItems;
        ListViewItem item = null;

        foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories())
        {
            item = new ListViewItem(dir.Name, 0);
            subItems = new ListViewItem.ListViewSubItem[]
              {new ListViewItem.ListViewSubItem(item, "Directory"), 
               new ListViewItem.ListViewSubItem(item, 
            dir.LastAccessTime.ToShortDateString())};
            item.SubItems.AddRange(subItems);
            listView1.Items.Add(item);
        }
        foreach (FileInfo file in nodeDirInfo.GetFiles())
        {
            item = new ListViewItem(file.Name, 1);
            subItems = new ListViewItem.ListViewSubItem[] { new ListViewItem.ListViewSubItem(item, "File"), new ListViewItem.ListViewSubItem(item, file.LastAccessTime.ToShortDateString()) };

            item.SubItems.AddRange(subItems);
            listView1.Items.Add(item);
        }

        listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
    }

    /********************************************/

    void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        TreeNode newSelected = e.Node;
        NodeSelect(newSelected);
    }

    /********************************************/

    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // When something is selected load it's contents to the listview if it is a directory
        if (listView1.SelectedItems.Count > 0)
        {
            var item = listView1.SelectedItems[0];

            // Don't do anything if it's just a file
            if (item.SubItems[1].Text == "File")
            {
                return;
            }

            TreeNode[] tns = treeView1.Nodes.Find(item.Text, true);
            if (tns.Length > 0)
            {
                treeView1.Focus();
                NodeSelect(tns[0]);
                treeView1.SelectedNode = tns[0];
                tns[0].Expand();
                FocusTreeview = true;
            }
        }
    }

    /********************************************/

    private void listView1_MouseUp(object sender, MouseEventArgs e)
    {
        // This needs to be done so the directory appears to stay selected in the treeview
        if (FocusTreeview == true)
        {
            treeView1.Focus();
            FocusTreeview = false;
        }
    }

    /********************************************/

    private void listView1_DoubleClick(object sender, EventArgs e)
    {
        // This will open the files that are double clicked on
        if (listView1.SelectedItems.Count > 0)
        {
            var item = listView1.SelectedItems[0];

            // Don't do anything for directories
            if (item.SubItems[1].Text == "Folder")
            {
                return;
            }

            // Open the selected file
            Process.Start(globals.szJobFolderPath + item.Text);

        }
    }

它最终看起来像这样。

您确实会丢失 Word 文档等已知文件的图标,但这对我来说没什么大不了的。您可以将已知文件类型的图标添加到您的图像列表中,并在将项目添加到列表视图的部分中放置一些 if 语句(或切换案例)。只需分析文件扩展名。

希望有一天这对某人有所帮助!

【讨论】:

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