我创建了一个定义为以管理员身份登录的服务 此服务执行系统(“net use Z:\ ... / user:user password”)并成功完成。
如果我(作为管理员)运行“net use”,我看到Z:确实添加了,但状态 - 不可用。
我尝试将ImpersonateLoggedOnUser添加到服务中,但这没有帮助。
操作系统:Win XP
我错过了什么?
答案 0 :(得分:5)
ImpersonateLoggedOnUser不会模拟用户令牌的登录会话,只会模拟安全上下文。但是,CreateProcessAsUser应该能够在与指定用户令牌关联的登录会话中创建新进程。
请注意,调用LogonUser获取CreateProcessAsUser的用户令牌将不起作用,因为此令牌不会与登录用户位于同一登录会话中。您必须找到用户的一个进程并复制其令牌。
登录会话没有详细记录,但您真正需要知道的是,每次用户通过身份验证时,都会创建一个不同的登录会话,并且每个此类登录会话都有一组不同的网络驱动器映射。登录会话与终端服务会话不同。
在Windows Vista及更高版本中,管理用户登录时会创建两个登录会话,一个与受限令牌关联,另一个与提升令牌关联。
您可以使用带有TokenStatistics选项的GetTokenInformation函数查找与令牌关联的登录会话。登录会话由AuthenticationId LUID标识。
要使这项工作,您的服务需要首先确定用户何时登录,等待与新会话关联的进程启动,确保它不是提升的进程,然后复制访问令牌。
相反,您最好的选择是将应用程序拆分为两个组件。一个组件将以用户身份运行(您可能会使用Run键自动启动它)并负责映射网络驱动器。它可以通过命名管道或注册表项联系服务以获取所需的任何信息。
答案 1 :(得分:3)
Windows登录Administrator并使用登录令牌启动该服务。如果以交互方式登录,Windows将为您创建登录令牌。这两个令牌彼此无关。映射设备映射为一个会话/登录令牌,因此,如果服务映射设备,则在登录会话中不会看到它。