【问题标题】:Lotus Notes Scheduled agent failed to open database in different serverLotus Notes 计划代理无法在不同服务器中打开数据库
【发布时间】:2013-02-04 04:10:04
【问题描述】:

我在服务器 1 中有一个数据库,它引用服务器 2 中的多个数据库以进行记录验证。计划代理运行时,遇到“未设置对象变量”错误。但是,当我尝试手动运行代理(右键单击代理名称,单击运行)时,它运行顺利,没有错误。

我在 2 个虚拟服务器中模拟了数据库设置,并且能够重现错误。逐行调试显示,在另一台服务器尝试打开数据库时出错。由于手动运行顺利,我不认为代码或变量(服务器和数据库路径)是错误的。

我检查了所有数据库的 ACL 以包括签名者和服务器,还尝试安排在所有 3 种安全模式下运行代理(受限制、不受限制和受管理员权限限制)。我查看了服务器文档和安全性,并允许访问和从两台服务器访问。还有什么我可能错过的吗?

【问题讨论】:

  • 您的服务器是否在同一个域中?您的代理中是否有任何代码在运行时强制重新编译?例如评估()。
  • 两台服务器在同一个域中。找不到对象变量发生在它尝试使用命令 If Not (dbname).Isopen 从其他服务器打开数据库的行。
  • 可能需要放一个小样本。该错误与 dbname 未初始化有关。

标签: lotus-notes lotus-domino


【解决方案1】:

我们将运行代理的服务器称为“server1”,将存储数据库的服务器称为“server2”。问题是代理以签署它的用户的身份运行,并且 server1 已经验证了该签名,但 server2 没有。 Server2 需要知道签名以便它可以对数据库强制执行 ACL,因此 server2 必须从 server1 获取签名信息。但是server1理论上可以骗server2,所以server2默认不信任server1的签名信息。

幸运的是,有一种方法可以告诉 server2 信任运行在 server1 上的代理上的签名。在 server2 上 Domino 目录中 server2 的服务器文档中,转到 Security 选项卡,找到标有“Trusted Servers”的字段。在此字段中输入 server1 的标准名称,然后重新启动 server2。 (我不确定是否真的需要重启。)

这应该允许您在 server1 上的代理读取 server2 上的数据库。

【讨论】:

  • 谢谢。我会试试这个,让你知道它是怎么回事。
  • 这仅适用于服务器位于不同域中的情况。
  • Simon,恕我直言,如果这是真的,我会感到惊讶。我确信在 R6 之前,代理永远无法访问另一台服务器上的数据库,即使在同一个域中也是如此。创建了受信任的服务器权限以允许它。我与 Charlie Kaufman(当时 Domino 的首席安全架构师)进行了长时间的讨论,讨论信任意味着什么。如果它在域内是自动的,那么任何能够在域中的一台服务器上创建代理的用户都将能够访问其他服务器上的数据库,即使该用户未在这些服务器的访问服务器字段中列出。跨度>
  • 这里有更详细的解释。考虑同一域中的 server1 和 server2。 User1 可以访问 server1 并且可以创建代理。 User1 不在 server2 的访问服务器列表中。 User1 在 server1 上创建一个代理,该代理在 server2 上打开 foo.nsf。此数据库具有 ACL default = Reader,依靠限制性访问服务器列表将其他人拒之门外。 (愚蠢,但它应该可以工作。)代理在 server1 上运行,并打开与 server2 的会话。虽然代理是由 user1 签名的,但 server1 使用自己的 ID 文件进行连接 - 因为它没有 user1 的 id 文件。
  • Server2 检查它的允许访问列表并找到 server1,所以我们越过了这个障碍。现在,server1 中的代理管理器代码知道代理正在代表 user1 运行,因此当它想要打开远程数据库时,它调用 NSFDbOpenExtended 并传入可选的 hNames 参数,该参数指向代理签名中使用的名称. Sever2 对照数据库 ACL 检查该名称——但不对照访问服务器列表,因为我们已经超越了它。瞧!安全已被绕过。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多