如果按服务映射,则网络驱动器不可用

时间:2011-12-01 09:47:03

标签: c windows networking service

我创建了一个定义为以管理员身份登录的服务 此服务执行系统(“net use Z:\ ... / user:user password”)并成功完成。

如果我(作为管理员)运行“net use”,我看到Z:确实添加了,但状态 - 不可用。

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

操作系统:Win XP

我错过了什么?

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

要使这项工作,您的服务需要首先确定用户何时登录,等待与新会话关联的进程启动,确保它不是提升的进程,然后复制访问令牌。

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

答案 1 :(得分:3)

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