none
Смена пароля локального администратора.

    Вопрос

  • Доброго всем!

    Описание: Требуется периодически менять пароль локального администратора на рабочих станциях 1го леса с 1 корневым и кучей дочерних доменов не затронув серверный парк. Соответственно разделение парка возможно только по OU. В домене присутствуют станции Windows 2000/XP/2003/Vista(оч мало).

    Что уже нашел: Нашел 2 скрипта по смене пароля, один основывается на подсетях (ручками вписываешь диапазон IP), второй основан на имене рабочей станции. Могу привести ссылки на их местоположение. Неприменимость данных скриптов заключается в том, что в сети полностью "Броуновское движение", т.е. наличие ноутов и подстольных серверов и присутствие юзеров

     на раб месте оставляет желать лучшего. 

    Может у кого есть опыт по решению данной проблемы стандартными средствами или нестандартными? Оговорюсь сразу - программер я никакой :-( .

    3 июня 2007 г. 15:26

Ответы

  • Может такой вариант. Пока тестировал на XP и 2k3
    Компьютер при старте обращается к страничке, страничка - скрипт .ASP выполняется от имени компьютера. Пароль хранится на сервере.

    Это страничка default.asp:

    <%
    strIPComputer = Request.ServerVariables("REMOTE_HOST")
    Call chPsw(strIPComputer)
    Response.Write strIPComputer
    
    SUB chPsw(strComputer)
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colComputers = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    For Each objComputer in colComputers 
     strComputer = objComputer.Name 
    Next 
    strComputerDN = getComputerDN(strComputer)
    If Instr(strComputerDN,"OU=WORKSTATIONS") > 0 Then
      Call chPsw1(strComputer,"Rtukq0987")
    ElseIf Instr(strComputerDN,"OU=NOTEBOOKS") > 0 Then
      Call chPsw2(strComputer,"Rtukq0987")
    End If
    End Sub
    
    Sub chPsw1(strComputer,strPass)
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colAccounts = objWMIService.ExecQuery ("Select * From Win32_Group Where LocalAccount = TRUE And SID = 'S-1-5-32-544'")
    For Each objAccount in colAccounts
    strGroup = objAccount.Name
    Next
    Set objGroup = GetObject("WinNT://" & strComputer & "/" & strGroup)
    For Each objUser in objGroup.Members
      strUserPath = objUser.aDSPath
      If Instr(strUserPath,"/" & strComputer & "/") > 0 Then
        set usr = GetObject(strUserPath & ",user")
        usr.SetPassword strPass
        usr.SetInfo
      End If
    Next
    End Sub
    
    Sub chPsw2(strComputer,strPass)
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colSystemUsers = objWMIService.ExecQuery ("Select * from Win32_UserAccount")
    For Each objSystemUser in colSystemUsers
      if Right(objSystemUser.SID,3)="500" Then
        strUserPath = objUser.aDSPath
        set usr = GetObject(strUserPath & ",user")
        usr.SetPassword strPass
        usr.SetInfo
      End If
    Next 
    End Sub
    
    Function getComputerDN(byval strComputer)
     Const ADS_NAME_INITTYPE_GC = 3
     Const ADS_NAME_TYPE_NT4 = 3
     Const ADS_NAME_TYPE_1779 = 1
     Set objSystemInfo = CreateObject("ADSystemInfo") 
     strDomain = objSystemInfo.DomainShortName
     Set objTrans = CreateObject("NameTranslate")
     objTrans.Init ADS_NAME_INITTYPE_GC, ""
     objTrans.Set ADS_NAME_TYPE_NT4, strDomain & "\" & strComputer & "$"
     getComputerDN = objTrans.Get(ADS_NAME_TYPE_1779)
    End Function
    %>


    chPsw1 и chPsw2 - разные стратегии смены пароля - только для локального администратора или для всех локальных администраторов. Проверка контейнера - защита.
    А это startup скрипт .vbs:


    Set XmlHttp = CreateObject("MSXML2.XMLHTTP")
    XmlHttp.open "GET","http://dc/pasword/",False
    XmlHttp.Send
    Немножко вырезал "лишнего", могут быть очепятки.
    21 апреля 2009 г. 6:00
  • wewerty , красивое решение!

    Василий , startup-скрипт инициирует запуск скрипта на веб-сервере, а не на клиенте.

    >
    проблема не в этом, а в том что пароль пойдет в открытом виде по сети.
    С этим полностью согласен. Как раз веб-сервер эту проблему решает.

    Вот мой исправленный вариант:

    http://dumpz.org/7708/

    Основные изменения:
    1)
    objWMIService.ExecQuery("Select * from Win32_UserAccount")
    изменено на
    objWMIService.ExecQuery("Select * from Win32_UserAccount where Domain=""" & WshNetwork.ComputerName & """")

    теперь происходит вывод действительно только ЛОКАЛЬНЫХ учеток => быстрее и корректнее работает скрипт.

    wewerty , рекомендую вам тоже изменить соответствующую строчку у себя

    2) До этого у меня менялись пассы всем локальным юзерам. Теперь системные не трогаются.
    if objSystemUser.Name<>"HelpAssistant" and objSystemUser.Name<>"SUPPORT_388945a0" and objSystemUser.Name<>"krbtgt" and objSystemUser.Name<>"ASPNET"  then
    
    
    .....
    21 апреля 2009 г. 11:43

Все ответы

  • http://www.microsoft.com/technet/scriptcenter/resources/qanda/oct04/hey1015.mspx

     

    Последний пример скрипта в статье решает вашу проблему, правда, там нет интерфейса и прочих украшений. Также учитывайте, что, если компьютер выключен, то пароль на нем изменен не будет.

    3 июня 2007 г. 16:48
    Модератор
  • А если совсем не хотите заниматься программированием, то, возможно, вас устроит вот этот визуальный инструмент по смене паролей локальных администраторов:

    XS BAP , ссылка на загрузку -  в статье.

    3 июня 2007 г. 18:31
    Модератор
  • Я решил проблемы с броуновским движением просто парой скриптов:
    - первый запускается групповыми политиками при старте системы и записывает на сервер в определенную папку файл с именем загружаемого компьютера
    - второй с определенной периодичностью сканирует эту папку, при нахождении какого-либо файла меняет пароль на загруженной системе
  • Тема пока не закрыта, я принял советы - идут испытания и отладка. Итог обязательно напишу. :-) Все не так уж и плохо, как я думал. ;-)
    5 июня 2007 г. 18:59
  • Скрипт по смене пароля ставишь в стартап скрипт, в самом скрипте проверяешь сервер это или нет
    Для примера скрипт, который меняет пароль админа на всех компьютерах кроме 2003 серверов
     
    Code Snippet
    Dim Container
    Dim ContainerName
    Dim User, UsrSID, b
    Dim WshNetwork
     
    Set WshNetwork = WScript.CreateObject("WScript.Network")
     
    ComputerName=WshNetwork.ComputerName
     
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & ComputerName & "\root\cimv2")
     

    Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem",,48)
     
    For Each objItem in colItems
     
      ostype=objItem.OSType
      osver=objItem.Version
      oslang=objItem.OSLanguage
      spver=objItem.ServicePackMajorVersion
    Next
     
    strOSVer = Left(osVer, 3)
     

    If strosver<>"5.2" then
     
    strSelect="Select * from Win32_UserAccount"
     
    Set colSystemUsers = objWMIService.ExecQuery (strSelect)
     
    For Each objSystemUser in colSystemUsers
    if Right(objSystemUser.SID,3)="500" Then
    Set objUser = GetObject("WinNT://" & ComputerName & "/" & objSystemUser.Name & ",user")
    NewPassword="supper"
    Call objUser.SetPassword(NewPassword)
    Exit For
    End If
    Next
     
    End if

     

     
    26 июня 2007 г. 5:31
  • Пароль в скприпте открытым текстом! Ужас! Лучше так не надо.
    26 июня 2007 г. 10:27
    Модератор
  •  sie написано:
    Пароль в скприпте открытым текстом! Ужас! Лучше так не надо.

     

    А какие варианты кроме шифрования майкрософтовской приблудой?

  • На днях, если успею протестировать, приведу пример.
    2 июля 2007 г. 12:03
    Модератор
  •  

    sie

    стесняюсь спросить, а тестирование прошло успешно, и можно пример в студию.Пасибо


    7 апреля 2008 г. 9:17
  • Нет, пока было не актуально.

     

    Могу изложить идею - может кто реализует и опубликует тут.

     

    Идея в том, чтобы отслеживать регистрацию клиентской машины при ее загрузке на контроллере домена (варианты WMI, EventLog, может еще что?) и по этому событию инициировать смену пароля из под учетки доменного администратора или иной учетки, имеющей права на смену пароля на клиентской машине.

     

    Главное не перенапрячь DC, т.к. число регистраций на нем может быть большое. Выход: делать систему асинхронной,т.е. ловить события регистрации и асинхронно передавать в другое приложение, которое реализует логику смены пароля.

    Логика смены пароля необходима, т.к. например, нет смысла менять пароль при каждой загрузке клиентского компьютера, нужно ставить фильтры (на одни компьютеры ставим один пароль на другие другой), нужно иметь лог (отчет) - где реально пароль поменяли, а где еще нет.

     

    Вот такие мысли. Все просто, но требует тщательного тестирования и аккуратной реализации.

    8 апреля 2008 г. 3:12
    Модератор
  • Вот интересный пример который я использую в своей компании для смены пароля локального админа ..

    'Created Yuriy shkvarenko (gen)
    On Error Resume Next
    Const ADS_SCOPE_SUBTREE = 2

    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"

    Set objCommand.ActiveConnection = objConnection
    objCommand.CommandText = _
    "Select Name From 'LDAP://DC=DOMAIN,DC=com,DC=ua' Where objectClass='computer'"  'измините тут  ваши данные
    objCommand.Properties("Page Size") = 10000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst

    Do Until objRecordSet.EOF
        strComputer = objRecordSet.Fields("Name").Value

        Set objUser = GetObject("WinNT://" & strComputer & "/Administrator")
        Set objUser = GetObject("WinNT://" & strComputer & "/Администратор")
        Set objUser = GetObject("WinNT://" & strComputer & "/admin")
        objUser.SetPassword generatePassword(passLen)

        objRecordSet.MoveNext
    '    WScript.Echo objUser
    Loop
    '    WScript.Echo "good complite"   

    passLen = 14
    Function generatePassword(PASSWORD_LENGTH)

    Dim NUMLOWER, NUMUPPER, LOWERBOUND, UPPERBOUND, LOWERBOUND1, UPPERBOUND1, SYMLOWER, SYMUPPER
    Dim newPassword, count, pwd
    Dim pCheckComplex, pCheckComplexUp, pCheckComplexLow, pCheckComplexNum, pCheckComplexSym, pCheckAnswer   
     NUMLOWER    = 48  ' 48 = 0
     NUMUPPER    = 57  ' 57 = 9
     LOWERBOUND  = 65  ' 65 = A
     UPPERBOUND  = 90  ' 90 = Z
     LOWERBOUND1 = 97  ' 97 = a
     UPPERBOUND1 = 122 ' 122 = z
     SYMLOWER    = 33  ' 33 = !
     SYMUPPER    = 46  ' 46 = .
     pCheckComplexUp  = 0 ' used later to check number of character types in password
     pCheckComplexLow = 0 ' used later to check number of character types in password
     pCheckComplexNum = 0 ' used later to check number of character types in password
     pCheckComplexSym = 0 ' used later to check number of character types in password

     ' initialize the random number generator
     Randomize()

     newPassword = ""
     count = 0
     DO UNTIL count = PASSWORD_LENGTH
       ' generate a num between 2 and 10
       ' if num < 5 create an uppercase
       If Int( ( 10 - 2 + 1 ) * Rnd + 2 ) < 5 Then
        pwd = Int( ( UPPERBOUND - LOWERBOUND + 1 ) * Rnd + LOWERBOUND )
       ' if num is between 4 and 7 create a lowecase
       Elseif Int( ( 10 - 2 + 1 ) * Rnd + 2 ) > 3 And  Int( ( 10 - 2 + 1 ) * Rnd + 2 ) < 8 Then
        pwd = Int( ( UPPERBOUND1 - LOWERBOUND1 + 1 ) * Rnd + LOWERBOUND1 )
        ' if num is between 8 and 10 generate a symbol
       Else
           pwd = Int( ( SYMUPPER - SYMLOWER + 1 ) * Rnd + SYMLOWER )
       End If 

      newPassword = newPassword + Chr( pwd ) 
      count = count + 1
     
      'Check to make sure that a proper mix of characters has been created.  If not discard the password.
      If count = (PASSWORD_LENGTH) Then
          For pCheckComplex = 1 To PASSWORD_LENGTH
              'Check for uppercase
              If Asc(Mid(newPassword,pCheckComplex,1)) >64 And Asc(Mid(newPassword,pCheckComplex,1))< 90 Then
                      pCheckComplexUp = 1
              'Check for lowercase
              ElseIf Asc(Mid(newPassword,pCheckComplex,1)) >96 And Asc(Mid(newPassword,pCheckComplex,1))< 123 Then
                      pCheckComplexLow = 1
              'Check for numbers
              ElseIf Asc(Mid(newPassword,pCheckComplex,1)) >47 And Asc(Mid(newPassword,pCheckComplex,1))< 58 Then
                      pCheckComplexNum = 1
              'Check for symbols
              ElseIf Asc(Mid(newPassword,pCheckComplex,1)) >32 And Asc(Mid(newPassword,pCheckComplex,1))< 47 Then
                      pCheckComplexSym = 1
              End If
          Next     
          'Add up the number of character sets.  We require 3 or 4 for a complex password.
          pCheckAnswer = pCheckComplexUp+pCheckComplexLow+pCheckComplexNum+pCheckComplexSym
               
          If pCheckAnswer < 3 Then
              newPassword = ""
              count = 0
          End If
      End If
     Loop
    'The password is good so return it
     generatePassword = newPassword
    End Function

    14 апреля 2008 г. 21:08
  • The_Dmitry Медали пользователяМедали пользователяМедали пользователяМедали пользователяМедали пользователя5 июня 2007 г. 11:04:40
    Я решил проблемы с броуновским движением просто парой скриптов:
    - первый запускается групповыми политиками при старте системы и записывает на сервер в определенную папку файл с именем загружаемого компьютера
    - второй с определенной периодичностью сканирует эту папку, при нахождении какого-либо файла меняет пароль на загруженной системе

    Приветствую, а можно эти пару скриптов увидеть?
    6 апреля 2009 г. 1:49
  • Мой вариант, созданный на основе ранее предложенного.
    Меняются пассы для всех локальных юзеров. Защита пасса (который открытым текстом) осуществляется за счет грамотно сконфигурированного ACL для самого скрипта.
    С помощью GPO кидать на исполнение при загрузке компа.

    http://dumpz.org/7656/
    19 апреля 2009 г. 18:06
  • Vlad K, если сценарий выполняется на системе, значит его код (и пароль) доступен системе, а следовательно и локальному пользователю имеющему физический доступ к системе. Если это не пугает - то лучше воспользоваться GP Preferences, там реализация удобна, не требуются сценарии, и пароль хотя бы шифруется :)

    - первый запускается групповыми политиками при старте системы и записывает на сервер в определенную папку файл с именем загружаемого компьютера
    - второй с определенной периодичностью сканирует эту папку, при нахождении какого-либо файла меняет пароль на загруженной системе

    Постараюсь сегодня набросать если не забуду.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    20 апреля 2009 г. 4:11
    Модератор
  • Вася! Ты неправ! :-)) В GPP пароли условно защищены Пароли в Group Policy Preference
    Сазонов Илья http://www.itcommunity.ru/blogs/sie/
    20 апреля 2009 г. 8:03
    Модератор
  • Илья, в том то и дело, что условно :) Шифроваться то они шифруются, но что толку если они всё равно расшифровываются на клиентской стороне? ;)
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    20 апреля 2009 г. 8:11
    Модератор
  • Вот чего набросал на скорую руку:

    SubscribeMe.cmd (засовываем в сценарий загрузки (startup script)):
    echo %computername% >> \\Server\PassChange\list.txt
    
    
    \\Server\PassChange - шара, доступ на запись в которую имеют только компьютеры домена.

    CheckAndChange.cmd (скрипт запускаемый на сервере из шедулера, из места к которому имеют доступ только администраторы, под учеткой с достаточными правами)
    for /f %%I in (c:\PassChange\list.txt) do winrs -r:%%I net user Ђ¤¬Ё­Ёбва в®а P@ssw0rd
    
    for /f %%I in (c:\PassChange\list.txt) do winrs -r:%%I net user Administrator P@ssw0rd
    
    del /q c:\PassChange\list.txt
    
    
    Для каждой строчки из файла, используя WS-Management выполняет команду на удалённом компьютере, и затем удаляет файл list.txt. Я просто сдублировал строчки с разными именами администраторов, вычислять по сиду из cmd - слишком трудоёмко :) В конце команд можно приписать >>logfile.txt
    Не рекомендую заменять winrs например на psexec, потому как тот передаёт команды в открытом виде. WS-Management же по ssl, да и вообще очень безопасный.

    Может быть, как нибудь, потом, попробую переписать на PowerShell, с определением имени по SID, проверкой сроков (чтоб не менять пароль каждый день), и красивым логгингом, например в журнал событий :) Если конечно кому то будет нужно еще :)
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    20 апреля 2009 г. 9:24
    Модератор
  • Василий, на скрипт changepass.vbs даются только права read&execute для domain computers. Таким образом, чтобы прочесть его содержимое и узнать пароль, юному хакеру потребуется запустить что-нибудь типа
    notepad \\path\to\share\changepass.vbs
    от имени пользователя SYSTEM.
    Как же он это сделает, если имеет по условию задачи права ограниченной учетной записи в системе (а если он админ, то нафига это ему нужно:) )?

    ЗЫ: я нашел пару косяков в предыдущем варианте своего скрипта, завтра постараюсь выложить пофиксенный.
    20 апреля 2009 г. 16:29
  • Vlad K, да, действительно, я прогнал, проблема не в этом, а в том что пароль пойдет в открытом виде по сети.
    Тогда моё решение с батниками и GP Preferences получаются вобщем эквивалентными в плане безопасности, но второе проще внедрять :)


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    20 апреля 2009 г. 16:35
    Модератор
  • Может такой вариант. Пока тестировал на XP и 2k3
    Компьютер при старте обращается к страничке, страничка - скрипт .ASP выполняется от имени компьютера. Пароль хранится на сервере.

    Это страничка default.asp:

    <%
    strIPComputer = Request.ServerVariables("REMOTE_HOST")
    Call chPsw(strIPComputer)
    Response.Write strIPComputer
    
    SUB chPsw(strComputer)
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colComputers = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    For Each objComputer in colComputers 
     strComputer = objComputer.Name 
    Next 
    strComputerDN = getComputerDN(strComputer)
    If Instr(strComputerDN,"OU=WORKSTATIONS") > 0 Then
      Call chPsw1(strComputer,"Rtukq0987")
    ElseIf Instr(strComputerDN,"OU=NOTEBOOKS") > 0 Then
      Call chPsw2(strComputer,"Rtukq0987")
    End If
    End Sub
    
    Sub chPsw1(strComputer,strPass)
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colAccounts = objWMIService.ExecQuery ("Select * From Win32_Group Where LocalAccount = TRUE And SID = 'S-1-5-32-544'")
    For Each objAccount in colAccounts
    strGroup = objAccount.Name
    Next
    Set objGroup = GetObject("WinNT://" & strComputer & "/" & strGroup)
    For Each objUser in objGroup.Members
      strUserPath = objUser.aDSPath
      If Instr(strUserPath,"/" & strComputer & "/") > 0 Then
        set usr = GetObject(strUserPath & ",user")
        usr.SetPassword strPass
        usr.SetInfo
      End If
    Next
    End Sub
    
    Sub chPsw2(strComputer,strPass)
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colSystemUsers = objWMIService.ExecQuery ("Select * from Win32_UserAccount")
    For Each objSystemUser in colSystemUsers
      if Right(objSystemUser.SID,3)="500" Then
        strUserPath = objUser.aDSPath
        set usr = GetObject(strUserPath & ",user")
        usr.SetPassword strPass
        usr.SetInfo
      End If
    Next 
    End Sub
    
    Function getComputerDN(byval strComputer)
     Const ADS_NAME_INITTYPE_GC = 3
     Const ADS_NAME_TYPE_NT4 = 3
     Const ADS_NAME_TYPE_1779 = 1
     Set objSystemInfo = CreateObject("ADSystemInfo") 
     strDomain = objSystemInfo.DomainShortName
     Set objTrans = CreateObject("NameTranslate")
     objTrans.Init ADS_NAME_INITTYPE_GC, ""
     objTrans.Set ADS_NAME_TYPE_NT4, strDomain & "\" & strComputer & "$"
     getComputerDN = objTrans.Get(ADS_NAME_TYPE_1779)
    End Function
    %>


    chPsw1 и chPsw2 - разные стратегии смены пароля - только для локального администратора или для всех локальных администраторов. Проверка контейнера - защита.
    А это startup скрипт .vbs:


    Set XmlHttp = CreateObject("MSXML2.XMLHTTP")
    XmlHttp.open "GET","http://dc/pasword/",False
    XmlHttp.Send
    Немножко вырезал "лишнего", могут быть очепятки.
    21 апреля 2009 г. 6:00
  • wewery, пароль хранится в текстовом файле страницы, в открытом виде. Страница как я понимаю при запросе передается через сеть в открытом виде.

    Кроме того, что мешает юзеру просто скачать эту страницу и посмотреть на пароли?

    Или я чего то не понимаю?


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    21 апреля 2009 г. 7:27
    Модератор
  • Пароль хранится в скрипте asp в папке "c:\inetpub\wwwroot\" на сервере. Удачи пользователю, он увидит только имя своего компьютера "Response.Write strIPComputer". Скрипт выполняется на стороне сервера, пользователь увидит только результат работы скрипта. ЗЫ: Как пример - пользователь не имеет доступа к коду server-side .PHP, .CGI, .ASP страниц на сайтах, а только к тексту сгенерированных ими страниц и client-side jscript и vbscript скриптов.
    21 апреля 2009 г. 8:03
  • Ага, теперь кажется понял. На IIS надо разрешить execute и запретить read из вебпапки? Может еще что то?


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    21 апреля 2009 г. 11:41
    Модератор
  • wewerty , красивое решение!

    Василий , startup-скрипт инициирует запуск скрипта на веб-сервере, а не на клиенте.

    >
    проблема не в этом, а в том что пароль пойдет в открытом виде по сети.
    С этим полностью согласен. Как раз веб-сервер эту проблему решает.

    Вот мой исправленный вариант:

    http://dumpz.org/7708/

    Основные изменения:
    1)
    objWMIService.ExecQuery("Select * from Win32_UserAccount")
    изменено на
    objWMIService.ExecQuery("Select * from Win32_UserAccount where Domain=""" & WshNetwork.ComputerName & """")

    теперь происходит вывод действительно только ЛОКАЛЬНЫХ учеток => быстрее и корректнее работает скрипт.

    wewerty , рекомендую вам тоже изменить соответствующую строчку у себя

    2) До этого у меня менялись пассы всем локальным юзерам. Теперь системные не трогаются.
    if objSystemUser.Name<>"HelpAssistant" and objSystemUser.Name<>"SUPPORT_388945a0" and objSystemUser.Name<>"krbtgt" and objSystemUser.Name<>"ASPNET"  then
    
    
    .....
    21 апреля 2009 г. 11:43
  • Вместо objWMIService.ExecQuery("Select * from Win32_UserAccount") надо писать objWMIService.ExecQuery("Select * from Win32_UserAccount where LocalAccount = True")
    Сазонов Илья http://www.itcommunity.ru/blogs/sie/
    22 апреля 2009 г. 9:59
    Модератор
  • Тоже долго думал как передать системе пароль, так чтобы пользователь не смог его подсмотреть. В результате получился целый комплекс мер по обеспечению физической и сетевой безопасности компьютеров. Внедрено ещё не полностью, но оттестировано полностью. Итак - мои 5 копеек:

    1) Пароль задаётся стартап-скриптом (на VBS + "шифрован" утилитой screnc). Пароль формируется по определённому алгоритму (вариация на тему XOR) из двух строк. Одна строка содержится в теле скрипта, а другая передаётся скрипту в качестве параметра командной строки.

    2) Чтобы юзер не смог узнать этот параметр - генерация результирующей политики запрещена. Это правда не распространяется на пользователей имеющих локальные админские права, но у нас большинство работают с правами рядовых...

    3) Чтобы юзер не смог скопировать файл скрипта - чтение политики разрешено только компьютерам, но не пользователям домена. Конечно, пользователь имеющий админские права может прикинуться системой и скопировать файл...

    4) Чтобы рядовой юзер не мог сбросить админский пароль - в CMOS загрузка только с HDD-0, пароль на CMOS и пломба на корпус.

    5) И наконец - доступ к компьютерам по сети разрешён только доменным учётным записям (админы, юзеры и КД). Даже если кто-то узнает пароль локального админа, воспользоваться им он сможет только с консоли. Прямой угрозы для других компов в сети он не представляет. Поэтому пароль один на всех компах и менять пока не собираемся.


    Пользователи имеющие локальные админские права могут обойти пункты 2 и 3. Но с большой вероятностью делать этого не будут т.к. у них и так всё есть.
  • Есть варианты решения проблемы четвертого пункта (пользователь срывает пломбу, обнуляет bios, делает плохие дела получает Админа, делает всё как было):
    1. Запретить локальный вход совсем (даже в безопасном режиме)
    2. Не пускать в домен с правами отличными на локальной машине от пользователя

    ?
    27 февраля 2010 г. 13:00
  • 0. Использовать терминальный клиент.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    28 февраля 2010 г. 7:13
    Модератор
  • wewerty, не поясните пару моментов?
    Как правильно раздать права?

    Суть проблемы: всё работает лишь в случае, когда в IIS->Directory Security включен анонимный доступ (с уч. записью доменного админа).
    В случае включения опции Integrated Win Authentication:
    под XP при выполнении логонскрипта выдаёт ошибку: "Отказано в доступе" 80070005
    под Win7 авторизируется на IIS как Domain\Comp$, но пароли локальных админов не меняются.
    Спасибо.