我寫這個的JScript驗證本地Windows用戶帳戶:身份驗證本地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是的,如果我將服務配置爲以管理員身份運行,但我不願意這樣做,因爲系統中的每個服務都配置爲運行作爲本地系統或網絡服務,所以我不知道它是否會有任何安全隱患......順便說一句,這個服務是OpenVPN。 – PaulK