当 Windows 用户不是管理员时,ReadXml 的不同行为

Posted

技术标签:

【中文标题】当 Windows 用户不是管理员时,ReadXml 的不同行为【英文标题】:ReadXml different behavior when windows user is not administrator 【发布时间】:2021-06-07 21:17:15 【问题描述】:

我知道这很疯狂,但我正面临一个意想不到且真正触发的问题。 启动时,我的应用程序(.net 4.7 fmk 中的 vb.net 桌面应用程序)读取包含应用程序的一些本地设置的 xml 文件。 现在,问题是如果我以管理员身份登录 Windows,一切都很好。如果我以普通用户身份访问,则文件本身无法正确读取。该应用程序给了我这个错误

System.IndexOutOfRangeException(0x80131508):位置 12 处没有行。 在 System.Data.RBTree`1.GetNodeByIndex(Int32 userIndex) 在 System.Data.DataRowCollection.get_Item(Int32 索引) 在 Health.NET.FrmLogin.OnLoad(EventArgs e)

在 XML 行 12 中实际存在。尽管用户登录 Windows,但 xml 文件是相同的。 两个更奇怪的效果: 1-错误出现在第 12 行,但即使 xml 没有该设置的零值,也会读取前面的一些行返回零值。 2- 此错误仅发生在 30 个客户端的环境中的一个客户端上。

这基本上是应用程序荣誉服务 7 年来第一次发生这种情况。

有没有人有办法解决这个疯狂的问题??

这是我正在使用的一些原始代码。这是非常标准的代码

            Dim ds As New DataSet
Dim Path as string = ""
            path = Application.StartupPath & "\LocalConfig.xml"
            ds.ReadXml(path)

            ' Set theme and LabelsPrinter
            If Not ds.Tables.Item(0).Rows(0).Item(0).ToString = String.Empty Then
                theme.Name = ds.Tables.Item(0).Rows(0).Item(0).ToString
            End If

            If Not ds.Tables.Item(0).Rows(2).Item(0).ToString = String.Empty Then
                LocalConfig.labelsPrinterName = ds.Tables.Item(0).Rows(2).Item(0).ToString
            End If

到目前为止,一切都正确无误,前面几行也是如此 但是当谈到这个时:

            ' Set LabelsSettings
            If Not ds.Tables.Item(0).Rows(7).Item(0).ToString = String.Empty Then
                LocalConfig.LabelMarginTop = ds.Tables.Item(0).Rows(7).Item(0)
            End If

            If Not ds.Tables.Item(0).Rows(8).Item(0).ToString = String.Empty Then
                LocalConfig.LabelMarginLeft = ds.Tables.Item(0).Rows(8).Item(0)
            End If

这些被读取但带有 0 值而不是给定的非零值

          If Not ds.Tables.Item(0).Rows(9).Item(0).ToString = String.Empty Then
              LocalConfig.UseLabelSettings = ds.Tables.Item(0).Rows(9).Item(0)
          End If

          ' Set Other Settings
          If Not ds.Tables.Item(0).Rows(10).Item(0).ToString = String.Empty Then
              LocalConfig.DefaultZoomMinutes = ds.Tables.Item(0).Rows(10).Item(0)
          End If

          If Not ds.Tables.Item(0).Rows(11).Item(0).ToString = String.Empty Then
              LocalConfig.DefaultKeepActualPlanningOnAddNew = ds.Tables.Item(0).Rows(11).Item(0)
          End If

前 3 行是正确的

          If Not ds.Tables.Item(0).Rows(12).Item(0).ToString = String.Empty Then
              LocalConfig.LabelPaperSizeX = ds.Tables.Item(0).Rows(12).Item(0)
          End If
          If Not ds.Tables.Item(0).Rows(13).Item(0).ToString = String.Empty Then
              LocalConfig.LabelPaperSizeY = ds.Tables.Item(0).Rows(13).Item(0)
          End If

尝试读取第 12 行会引发错误,即使它实际上在 XML 中

我再次忍受:作为管理员登录,一切都很好

请帮忙

编辑: 如果使用普通用户登录但以管理员权限启动应用程序一切正常:-O 包含 xml 的文件夹对“所有人”集具有完全控制权

【问题讨论】:

【参考方案1】:

评论太长了:问题可能是 Application.StartupPath 对于每个使用 ClickOnce 部署的应用程序的用户都不同。我只是假设它是并且某个特定用户在该位置没有有效的 xml 内容。

根据the documentation.

此路径会有所不同,具体取决于 Windows 窗体是否 应用程序是使用 ClickOnce 部署的。 ClickOnce 应用程序是 存储在 C:\Documents 中的每个用户应用程序缓存中,并且 设置\用户名目录。

问题在于它是如何实际部署的,以及您是否有权检查该环境以验证文件是否处于应有的状态。

如果可能,请告诉我。如果没有,我将删除答案。谢谢

【讨论】:

感谢您的回答。该应用程序使用常见的 Windows 安装程序进行部署。顺便说一句,我记录了“路径”变量,它为管理员和非管理员用户返回相同的路径。更多:我在读取 xml 后记录了数据集中的行数,当以管理员身份登录时,它以管理员身份返回 14 行,以普通用户身份返回 12 行 好的。这真的很奇怪。我现在唯一能想到的要找到问题的方法是检查if(ds.HasErrors) var errors = ds.Tables.Item(0).GetErrors(); // log it 。 Example in docs 谢谢,这可能会有所帮助。我会尽力让你知道

以上是关于当 Windows 用户不是管理员时,ReadXml 的不同行为的主要内容,如果未能解决你的问题,请参考以下文章

如何防止标准 Windows 10 用户的卸载程序提升?

Integrated Security=SSPI 是不是需要管理员组中的 Windows 用户?

检索用户的桌面文件夹VBScript

为啥我的windows里开启来宾账户,但是来宾账户不能登录

当应用需要管理员权限并在管理员下启动时获取受限用户文件夹

验证 Windows 用户名/密码是不是具有管理员权限