再谈关于windows服务中的会话隔离
windows service(服务)自windows vista起就工作在session 0,默认账户是SYSTEM账号,这个账户的权限是最高的,高于Administrator。
在windows服务中使用robocopy备份文件的时候,代码中调用cmdkey /add:ip /user:user /pass:password 来添加windows凭据并期望能在windows凭据管理器里看到它。
然而在robocopy执行的时候却报错,在windows凭据管理器里也看不到添加的凭据。
经过检索,发现SYSTEM账户有自己的凭据存储区域,因此在administrator账户下是看不到的。
又得知psexec可以以SYSTEM用户运行执行的进程(这里需要的是cmd),在我的机器上可以,但是在另外一台服务器上却不可以,执行 psexec -i -s cmd.exe 总是报错【找不到网络名】,
经过Google,发现有其他人也遇到过这个问题,解决方案就是修改注册表里的两个表项(如果不存在则创建),如下:
没有的话执行下2句命令
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v "AutoShareServer" /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v "AutoShareWks" /t REG_DWORD /d 1 /f
执行命令后重启系统就可以了正常执行提权命令了
记住了。。是重启系统以后。。
重启计算机后,执行 psexec -i -s cmd.exe 正常。
输入 cmdkey /list 就看到了SYSTEM账户下的凭据。
我用的是 PsExec v2.43
https://learn.microsoft.com/en-us/sysinternals/downloads/psexec
参考:
https://blog.csdn.net/hongkaihua1987/article/details/85230694
https://cloud.tencent.com/developer/article/2018160
https://www.cnblogs.com/stweily/p/16963220.html