Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 565
Благодарности: 41

Профиль | Сайт | Отправить PM | Цитировать


Цитата:
И как это можно исправить, если ты не приводишь код?
А никак. Надо придумать другой способ. Код вот:

Код: Выделить весь код
Func GetSid($_Username)  ;возвращает сид юзера. имя должно быть полным, все довески(домен, комп) должны быть уже переданы в функкцию
	FileDelete(@TempDir & '\getsid.tmp')
	Run(@ComSpec & ' /c "' & @ScriptDir & '\psgetsid.exe" ' & $_Username & '> ' & @TempDir & '\getsid.tmp', '', @SW_HIDE)
	Sleep(50)
	Local $f= FileOpen(@TempDir & '\getsid.tmp',0)
	Local $a= FileReadLine($f,2)
	FileClose($f)
	If StringStripWS ( $a, 8) <> "" Then Return StringStripWS($a, 8)
	Return $_Username
EndFunc
Дело в том, что эта функция используется в цикле до 2-3 тыс. раз. И обработка файлового вывода вообще не вариант, цикл будет выполняться годами. Есть вариант вот такой:
Код: Выделить весь код
Func GetSid($UserName, $Domain)

    Dim $UserSID, $oWshNetwork, $oUserAccount
    $objWMIService = objGet( "winmgmts:{impersonationLevel=impersonate}!//"  & @ComputerName & "/root/cimv2")
    $oUserAccounts = $objWMIService.ExecQuery("Select SID from Win32_UserAccount WHERE Name = '" & $UserName & "' AND Domain = '" & $Domain & "'")
    For $oUserAccount In $oUserAccounts 
        Return $oUserAccount.SID
    next
EndFunc
Но у него свои недостатки - в функцию надо передавать отдельно имя пользователя и домен. В то время как первая функция умеет конвертировать имена в любом формате, например user@domain.local

Отправлено: 13:42, 08-08-2006 | #272