我知道当您将Domino作为以本地帐户或不同用户身份运行的服务运行时,会出现特定问题。但是,我在这里运行它作为普通应用程序的用户权限。然后我从服务器控制台启动代理:tell amgr run etc
。
我正在尝试以两种方式枚举可用的驱动器 - 作为使用Java功能和使用Windows特定的wmic的Filesystem根。相关代码是:
System.out.println("os:"+System.getProperty("os.name") + " user:" + System.getProperty("user.name"));
File[] roots = File.listRoots();
for (File root : roots) {
if (root.canWrite()) {
System.out.println("[rw] " + root.getPath());
} else {
System.out.println("[ro] " + root.getPath());
}
}
Process process = Runtime.getRuntime().exec(
new String[] { "wmic", "logicaldisk", "get",
"deviceid,volumename,volumeserialnumber" });
process.getOutputStream().close();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
从客户端(或简单地从独立的Java应用程序)运行我得到所有驱动器:
os:Windows 7 user:normunds
[rw] C:\
[ro] D:\
[rw] N:\
[rw] W:\
DeviceID VolumeName VolumeSerialNumber
C: Acer 12857911
D:
N: video EE1C7944
W: DB_70 18389143
其中N:'video'是网络驱动器上的映射共享。
然而,当我在服务器(同一台PC)上运行它时,我只得到本地的,而不是远程的smb驱动器:
19.11.2013 23:00:42 Agent Manager: Agent printing: os:Windows 7 user:normunds
19.11.2013 23:00:42 Agent Manager: Agent printing: [rw] C:\
19.11.2013 23:00:42 Agent Manager: Agent printing: [ro] D:\
19.11.2013 23:00:42 Agent Manager: Agent printing: [rw] W:\
19.11.2013 23:00:42 Agent Manager: Agent printing: DeviceID VolumeName VolumeSerialNumber
19.11.2013 23:00:42 Agent Manager: Agent printing: C: Acer 12857911
19.11.2013 23:00:42 Agent Manager: Agent printing: D:
19.11.2013 23:00:42 Agent Manager: Agent printing: W: DB_70 18389143
注意用户名,代码以我的名字运行;至少这是Java的想法。我无法弄清楚导致问题的原因。
我甚至尝试通过从LotusScript代码调用Windows API方法来编写另一个版本:
Declare Private Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (Byval nBufferLength As Long, Byval lpBuffer As String) As Long
具有相同的结果 - 从客户端工作并返回所有驱动器,它错过了服务器。我想还有一步就是向Windows API询问用户名。 更新:刚刚做到了,它也返回了“normunds”。
有关如何处理此问题的任何想法?
编辑:我认为发生的事情是Domino运行servertasks作为模拟服务器已经启动的用户的单独进程。通过这种方式,它可以关闭对远程资源的访问,如果它运行具有委派级别(模仿)的servertasks,则可以使用这些资源。
现在可以通过修改某些安全策略或注册表来改变这种情况吗?据我所知,在这种情况下网络访问发生在NullSession(匿名用户),所以我假设一个解决方案是在远程端启用匿名共享访问,并允许NullSession在本地访问此共享。编辑:似乎没有帮助: - /
其他非常疯狂的解决方案是使用LogonUser Windows API从代理登录以再次登录同一用户但具有完全权限(不确定这是否可行,即使它是可行的,也就是存储意味着存储某处用户名/密码:-)是的,它会限制我们使用LotusScript解决方案,除非我们想安装JNI包装器;这一切应该实际上都在XPage中(代理只是问题的一个例子)
第三种解决方案是使用UNC pathes而不是映射驱动器并使用适当的用户名/密码访问路径(或匿名+允许NullSession访问),但这种解决方案有点击败我的目的发现映射驱动器并执行此操作或取决于哪些可用。
答案 0 :(得分:1)
问题是由于网络驱动器在Windows Server上的映射方式。 后台服务无法按定义访问网络驱动器,因为对象是在交互式登录时映射的。
Microsoft官方文档:
http://support.microsoft.com/kb/180362
可在此处找到更多信息:
Map a network drive to be used by a service
我过去开发了几个Windows服务,这是一个受到控制的约束。
我希望这会有所帮助。
干杯 莫里吉奥