Получение вывода консоли с правами администратора (UAC) - PullRequest
0 голосов
/ 28 февраля 2019

tldr; Мне нужно запустить команду от имени администратора и получить выходные данные

Я уже создал файл bat, который выполняет эту работу, но я хочу перевести его на чистыйРубин как учебное упражнение.Используя обратные пометки, я могу получить вывод от команды, к сожалению, вывод говорит мне, что у меня нет привилегий пользователя.На этом сайте я узнал, как правильно провернуть UAC, но я не могу заставить его распознавать нужную мне команду (bcdedit / v)

Я прочитал https://docs.microsoft.com/en-us/windows/desktop/shell/shell-shellexecute & Определите, если вы работаете с правами администратора в Windows XP и множеством сообщений о переполнении стека с похожими вопросами, но не нашли четких рекомендаций для этого.

def running_in_admin_mode?
    (`reg query HKU\\S-1-5-19 2>&1` =~ /ERROR/).nil?
end

unless running_in_admin_mode? 
    shell = WIN32OLE.new('Shell.Application')
    shell.ShellExecute("ruby", File.expand_path(__FILE__), nil, 'runas')
    exit
end

обновление: так что вроде работает.Он высвечивает вывод, который я хочу, в оболочке IRB, но открывает бесконечные новые оболочки, которые блокируют компьютер.

require 'win32ole'

shell = WIN32OLE.new('Shell.Application')
shell.ShellExecute("ruby", File.expand_path(__FILE__), nil, 'runas')
response = `bcdedit /v`
p response
exit

Обновление: откажитесь от этого сейчас.Вместо этого просто проверяю ответы.Код еще не полностью функционален, но вот где я нахожусь, если кто-то хочет вмешаться.

require 'win32/registry'
require 'win32ole'

p 'Device Guard v0.1'
p 'Checking for requisite permissions'


def disable
p 'Would you like me to disable Docker and enable VMWare? [Yes] or [No]'
  case (gets.downcase.chomp)
  when 'yes'
    puts "Disabling docker"
    `bcdedit /set hypervisorlaunchtype off` # seems to work ok
    Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\Microsoft\Windows\CurrentVersion\Run') do |reg|
      value = reg['Docker for Windows'] # need to save the location of the executable for next time
      reg.delete_value('Docker for Windows') # Access denied even when run as admin :()
    end
  when 'no'
  recheck
  else
  puts 'Instructions unclear'
  disable
  end
end

def enable
  p 'Would you like me to disable VMWare and enable Docker? [Yes] or [No]'
  case (gets.downcase.chomp)
  when 'yes'
    Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\Microsoft\Windows\CurrentVersion\Run') do |reg|
      docker_location = reg['Docker for Windows']
      p docker_location
    `bcdedit /set hypervisorlaunchtype Auto`
end
  when 'no'
    recheck
  else
    puts "Instructions unclear"
    enable
  end
end

def recheck
  p 'Well what do you want me to do then? [Recheck] or [Exit]'
  case (gets.downcase.chomp)
  when 'recheck'
    startup
  when 'exit'
    puts "bye then"
    exit
  else
    puts "Instructions unclear"
    recheck
  end
end

def check_hypervisor(response)
  edited_response = response.match('hypervisorlaunchtype(.*)')[1]
  if edited_response.end_with?("    Off")
    p 'Hypervisor Launch Type is disabled'
    p 'This means VMWare should run and Docker is disabled'
    enable
  elsif edited_response.end_with?("    Auto")
    p 'Hypervisor Launch Type is enabled'
    p 'This means that Docker should run and VMWare is disabled'
    disable
  end
end

def startup
  response = `bcdedit /v`
  unless response.include?("Windows Boot Manager")
    no_access
  end

  unless response.include?("Access is denied")
    check_hypervisor(response)
  end
end

def no_access
  p 'I am not running as admin. Please run me from a shell with admin privilages'
  exit
end

startup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...