我想在 Windows 服务内的网络驱动器上映射一个清晰的视图。
我试过用net use
命令,但它不能正常工作。
2 回答
我希望这种方法能奏效,但它确实不是来自服务;我已经非常激烈地解决了这个问题,但无济于事。问题有两个方面:
- 从 Windows 服务中,为了能够映射其他用户可见的驱动器,它必须以“本地系统”帐户(默认)“登录”并设置“与桌面交互”属性。
- 为了能够与 ClearCase 对话,Windows 服务进程必须以具有 ClearCase 访问权限的普通用户身份“登录”(例如,通常在 atria 组中)。
所以(1)和(2)是互斥的,但是你需要两者都做,不能。对于(2),您无法“与桌面交互”和映射驱动器的原因可能是因为您需要一个登录会话/令牌,必须存在该登录会话/令牌才能使映射的驱动器工作-关联的每用户会话- - 但是服务需要能够在不存在“会话”/令牌的情况下无头运行(没有人登录)。
请注意,Rational BuildForge 为 ClearCase 解决此问题的方式是生成一个全新的子进程,仅允许其服务与 ClearCase 对话:
另请注意,“登录会话”由唯一令牌标识;这意味着即使您有一个可以访问 ClearCase 的所需用户(域\fred)运行的进程,从那里生成一个新进程作为相同的用户(域\fred)默认情况下可能没有相同的会话令牌,具体取决于关于它是如何创建的(即 CreateProcess() vs CreateProcessAsUser() vs CreateProcessWithLogonW()),这使得处理您无法控制的工具变得更加困难。为了证明这一点,请尝试从命令提示符运行 'runas /user: "cmd /k \"net use\""',您会看到所有网络驱动器都列为“不可用”(!!)。
如果您能够以某种方式设法让用户始终登录以获取其会话令牌,则可以(尽管 Microsoft 明确不推荐)努力使这一切正常工作,如下所述:
从非交互式服务 (win32/.net/powershell) 启动 UAC 提升进程
否则,您必须像 BuildForge 那样模拟它。
另见:
对于这类问题,我通常会使用作为 Windows 服务运行的 CI 服务器(CC.NET / Hudson / TeamCity)遇到它。我必须做的是确保在我真正的“工作”开始之前的某个地方,我编写了一种映射网络驱动器的方法,方法是在运行时重新映射它们或将 M:\ 映射到带有 subst 的可用驱动器号(非常乏味) 正如 VonC 所描述的那样,这不是持久的(即使您使用 'net use /persistent:yes'),我猜这也是您所希望的。