打开文件

时间:2016-01-19 19:21:07

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

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

enter image description here

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

enter image description here

单击“确定”后,文件将根据需要打开。

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

是否有一种编程方式可以防止这种情况出现,或者这是否必须作为受信任的站点添加到浏览器中?我们网络上的标准用户无权添加受信任的站点。我试图检查IE的本地Intranet部分中的“包括所有网络路径UNC”。

我试过了

webBrowser1.ScriptErrorsSuppressed = true;

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

1 个答案:

答案 0 :(得分:0)

我在问题中找到了两个解决方案。

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

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

  1. 通过所需域OU的组策略将file://servername/*添加到Intranet区域。
  2. 通过所需域OU的组策略启用IE设置“在IFRAME中启动应用程序和文件”策略。
  3. 结果#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);
    
            }
        }
    

    最终看起来像这样。

    enter image description here

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

    希望有一天这会帮助某人!