【发布时间】:2015-05-06 22:27:37
【问题描述】:
我编写了这个 JScript 来验证本地 Windows 用户帐户:
function ValidateCredentials(strUsername, strPassword) {
var ADS_SECURE_AUTHENTICATION = 1;
var objWMISvc = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colItems = objWMISvc.ExecQuery( "Select * from Win32_ComputerSystem");
for (var it = new Enumerator(colItems); !it.atEnd(); it.moveNext()) {
var objItem = it.item();
if (objItem.PartOfDomain)
continue;
var strWorkgroup = objItem.Domain;
var strComputer = objItem.Name;
var strPath = "WinNT://" + strWorkgroup + "/" + strComputer + "/" +
strUsername + ",user";
try {
var objIADS = GetObject("WinNT:").OpenDSObject(strPath, strUsername,
strPassword, ADS_SECURE_AUTHENTICATION);
WScript.Echo("OK");
} catch(e) {
WScript.Echo("Invalid Username/Password");
}
}
}
ValidateCredentials(WScript.Arguments(0), WScript.Arguments(1));
当我以管理员和普通用户的身份从命令提示符运行它时,它工作正常。当脚本由作为 LocalSystem 用户运行的服务进程调用时,它不起作用。相反,对 OpenDSObject 的调用会引发异常,错误代码为 -2147023584(指定的登录会话不存在。它可能已经终止)。
这里有什么问题,我认为 LocalSystem 帐户实际上比管理员帐户更有特权或受信任?
您可以通过将脚本保存到某个 .js 文件中来亲自试用该脚本,然后在命令提示符下运行它,如下所示:
cscript.exe validate.js myUsername myPassword
【问题讨论】:
-
LocalSystem 帐户实际上并不比管理员帐户享有更多或更少的特权/信任。它只是......不同的信任。也就是说,它具有普通用户帐户所没有的一些权利——但它也有一些其他帐户几乎没有的限制。
-
这在任何情况下都不是安全问题,即 Windows 不会出于安全原因故意阻止您这样做。只是在此上下文中不支持 OpenDSObject 所做的任何事情。 (它可能在配置为在实际帐户中运行的服务中工作。)
-
@HarryJohnston 是的,如果我将服务配置为以管理员身份运行,它确实有效,但我不愿意这样做,因为系统中的每个服务都配置为作为 LocalSystem 或 NetworkService 运行,所以我不确定它是否有任何安全隐患...顺便说一下,有问题的服务是 OpenVPN。
-
@JerryCoffin 你知道我应该寻找哪个特权令牌吗?我正在比较 LocalSystem 和普通帐户的“whoami /priv”输出,但不确定要查找什么...
标签: active-directory ldap windows-authentication directoryservices adsi