Я написал этот 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 имя пользователя мой пароль