如果通过服务映射networking驱动器不可用

我创build了一个定义为以pipe理员身份login的服务
该服务执行系统(“net use Z:\ … / user:user password”)并成功完成。

如果我(以pipe理员身份)运行“净使用”,我看到Z:确实添加了,但状态不可用。

我尝试添加ImpersonateLoggedOnUser到服务,但是没有帮助。

操作系统:Win XP

我错过了什么?

ImpersonateLoggedOnUser不会模拟登录会话从用户令牌,只是安全上下文。 但是,CreateProcessAsUser应该能够在与指定用户令牌关联的登录会话中创建一个新进程。

请注意,调用LogonUser以获取CreateProcessAsUser的用户令牌将不起作用,因为此令牌与登录用户不在同一个登录会话中。 你必须找到一个用户的进程并复制它的令牌。

登录会话没有很好的文档记录,但是您真正需要知道的是,每次用户通过身份验证时,都会创建一个不同的登录会话,并且每个此类登录会话都有一组不同的网络驱动器映射。 登录会话与终端服务会话不同。

在Windows Vista及更高版本中,管理用户登录时会创建两个登录会话,一个与受限令牌关联,另一个与提升令牌关联。

您可以使用带有TokenStatistics选项的GetTokenInformation函数查找与令牌关联的登录会话。 登录会话由AuthenticationId LUID标识。

要做到这一点,你的服务需要先弄清楚用户何时登录,等待与新会话相关的进程启动,确保它不是一个提升的进程,然后复制访问令牌。

相反,你最好的选择是把应用程序分成两个部分。 一个组件将以用户身份运行(您可能会使用Run键自动启动该组件),并负责映射网络驱动器。 它可以通过命名管道或注册表键来联系服务以获取所需的任何信息。

Windows登录管理员并使用登录标记来启动该服务。 如果您以交互方式登录,Windows将为您创建一个登录标记。 这两个令牌不相互关联。 映射的设备映射为一个会话/登录令牌,因此,如果服务映射设备,则在登录会话中不会看到它。