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

问题描述:

我创建了一个定义为以管理员身份登录的服务。
该服务执行系统(“net use Z:\ .../user:user password”)并成功完成。如果通过服务映射网络驱动器不可用

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

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

OS:Win XP的

我缺少什么?

+0

http://www.ljcreate.com/support/faqs/answers.asp?ID=1254有帮助吗? –

+0

添加“操作系统:Win XP”,所以不是真的,但谢谢。 –

+0

这可以通过各种(复杂的)方式来完成。一个是复制与其中一个交互式进程关联的用户令牌,然后调用CreateProcessAsUser。另一种方法是向NetUseAdd注入一个交互过程。但是,在交互式上下文中开始运行代码几乎肯定会更明智。重申维尔纳的问题:你想做什么? –

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

请注意,调用LogonUser的以获取CreateProcessAsUser用户令牌是行不通的,因为这个令牌不会在同一个登录会话的登录用户。你必须找到一个用户的进程并复制它的令牌。

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

在Windows Vista及以上时,一个管理用户登录使用受限令牌和一个与提升的令牌相关的关联创建两个登录会话。

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

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

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

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

+0

这解释了这个问题,但它可以解决?我可以模拟交互式令牌吗?我可以创建更多1次会话的映射吗?任何类型的解决方法? –

+0

也许你可以告诉你想要达到什么目的,为什么认为该服务应该为交互式登录的用户创建驱动器映射!? –