none
Выключение компьютеров RRS feed

  • Вопрос

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

    On Error Resume Next
    
    strUsername="Shutdown"
    strPasswd="P@ssw0rd"
    strComputerList="ShutdownList.txt"   
    
    strScriptPath = WScript.ScriptFullName 
    strScriptPath = left(strScriptPath,instrrev(strScriptPath,"\")) 
    strComputerList=strScriptPath & strComputerList
    
    Const ForReading = 1
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTextFile = objFSO.OpenTextFile(strComputerList, ForReading)
    Do Until objTextFile.AtEndOfStream
      strNextLine = objTextFile.Readline
      ShutdownSystem strNextLine
    Loop
    
    WScript.Quit 0
    
    Sub ShutdownSystem(ComputerName)
    
       Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
       Set objSWbemServices = objSWbemLocator.ConnectServer(ComputerName, "root\cimv2", strUsername, strPasswd)
       objSWbemServices.Security_.ImpersonationLevel = 3 
    	
       Set OpSysSet = objSWbemServices.ExecQuery("select * from Win32_OperatingSystem" & " where Primary=true") 
      
       For each OpSys in OpSysSet 
          opSys.Shutdown()
       Next    
    
    End Sub



    Завел указанную учетную запись Shutdown на всех нужных компьютерах и дал ей права "Shut down the system"  и "Force shutdown from a remote system" (в группу администраторов данная учетная запись не входит). При запуске скрипта выдается ошибка "SWbemLocator: Отказано в доступе."

    Если в скрипте задать учетную запись с административными правами, то всё работает. Как я понимаю, не хватает прав для доступа к WMI или DCOM. Но каких?

     

    10 июня 2011 г. 9:29

Ответы

Все ответы

    • Помечено в качестве ответа Evgenii Alekseev 14 июня 2011 г. 8:26
    10 июня 2011 г. 9:35
    Отвечающий
  • Eugene Alekseev, попробуйте после оператора

    objSWbemServices.Security_.ImpersonationLevel = 3


    добавить оператор

    objSWbemServices.Security_.Privileges.Add 23

    10 июня 2011 г. 13:29
  • Вы всё ещё не используете WMI?

    "Администраторам Windows хорошо известны настройки безопасности системы и их раздел «User Right Assignments» (привилегии пользователей), доступные в консоли безопасности системы и групповых политиках домена. Ряд действий с операционной системой можно проделать только при наличии у пользователя или группы, куда он входит, той или иной привилегии. К таким действиям относятся, например, перезагрузка системы (завершение ее работы), восстановление состояния системы из резервной копии или смена системного времени.

    Поскольку с использованием WMI можно выполнить все эти действия, разработчики WMI заложили дополнительный механизм защиты. Смысл его в следующем: даже если учетная запись пользователя обладает необходимыми для действия с системой привилегиями, он все равно не сможет выполнить это действие, пока явно не активирует эту привилегию перед выполнением действия. В частности, если администратор запустит скрипт WMI, запрашивающий перезагрузку системы, этого все равно не произойдет, пока в скрипте не будет явно активирована эта привилегия."

     


    my blog: http://shserg.ru/
    10 июня 2011 г. 14:39
  • Всем спасибо! Во вторник испробую ваши рекомендации.

    Так как я не программист, мне немного не понятно, разве штатная команда shutdown и скрипты использующие WMI не используют в конце-концов одни и теже системные вызовы и библиотеки?

    P.S: У меня уже складывается впечатление, что для избежения раздачи излишних прав в моем случае правильней создать батник с использование команды shutdown, запланировать его в планировщике от имени аккаунта "Shutdown" (см. первое сообщение) и стартовать задание вручную по мере необходимости.

    10 июня 2011 г. 15:55
  • >P.S: У меня уже складывается впечатление, что для избежения раздачи излишних прав в моем случае правильней создать батник с использование команды shutdown, запланировать его в планировщике от имени аккаунта "Shutdown" (см. первое сообщение) и стартовать задание вручную по мере необходимости.

    Никаких излишних прав вы не выдадите. Просто перед тем, как выполнить привилегированное действие, вам необходимо в скрипте явно обозначить свое желание выполнить это привелигированное действие (своего рода защита от дурака, точно так же в большинстве языков программирования вы обязаны объявить переменную перед ее использованием).

    Если же вы таки решите использовать команнду shutdown, то примите во внимание наличие бага


    my blog: http://shserg.ru/
    11 июня 2011 г. 13:24