winrm-elevated 0.4.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +8 -8
- data/.rspec +3 -3
- data/.rubocop.yml +17 -17
- data/.travis.yml +10 -10
- data/Gemfile +9 -9
- data/LICENSE +202 -202
- data/README.md +86 -82
- data/Rakefile +28 -28
- data/VERSION +1 -1
- data/appveyor.yml +39 -39
- data/changelog.md +18 -18
- data/lib/winrm/shells/elevated.rb +99 -0
- data/lib/winrm-elevated/scripts/elevated_shell.ps1 +108 -105
- data/lib/winrm-elevated.rb +18 -25
- data/spec/config-example.yml +3 -5
- data/spec/matchers.rb +50 -64
- data/spec/powershell_elevated_spec.rb +87 -93
- data/spec/spec_helper.rb +58 -46
- data/winrm-elevated.gemspec +33 -33
- metadata +10 -10
- data/lib/winrm-elevated/runner.rb +0 -83
data/spec/spec_helper.rb
CHANGED
|
@@ -1,46 +1,58 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
require 'winrm'
|
|
3
|
-
require 'winrm-elevated'
|
|
4
|
-
require_relative 'matchers'
|
|
5
|
-
|
|
6
|
-
# Creates a WinRM connection for integration tests
|
|
7
|
-
module ConnectionHelper
|
|
8
|
-
def winrm_connection
|
|
9
|
-
WinRM::
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require 'winrm'
|
|
3
|
+
require 'winrm-elevated'
|
|
4
|
+
require_relative 'matchers'
|
|
5
|
+
|
|
6
|
+
# Creates a WinRM connection for integration tests
|
|
7
|
+
module ConnectionHelper
|
|
8
|
+
def winrm_connection
|
|
9
|
+
WinRM::Connection.new(winrm_config)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def elevated_shell
|
|
13
|
+
@elevated_shell ||= winrm_connection.shell(:elevated)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def winrm_config
|
|
17
|
+
unless @winrm_config
|
|
18
|
+
path = File.expand_path("#{File.dirname(__FILE__)}/config.yml")
|
|
19
|
+
unless File.exist?(path)
|
|
20
|
+
path = File.expand_path("#{File.dirname(__FILE__)}/config-example.yml")
|
|
21
|
+
end
|
|
22
|
+
@winrm_config = symbolize_keys(YAML.load(File.read(path)))
|
|
23
|
+
@winrm_config[:endpoint] = ENV['winrm_endpoint'] if ENV['winrm_endpoint']
|
|
24
|
+
@winrm_config[:user] = ENV['winrm_user'] if ENV['winrm_user']
|
|
25
|
+
@winrm_config[:password] = ENV['winrm_password'] if ENV['winrm_password']
|
|
26
|
+
end
|
|
27
|
+
@winrm_config
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def username
|
|
31
|
+
winrm_config[:user]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def password
|
|
35
|
+
winrm_config[:password]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# rubocop:disable Metrics/MethodLength
|
|
39
|
+
def symbolize_keys(hash)
|
|
40
|
+
hash.each_with_object({}) do |(key, value), result|
|
|
41
|
+
new_key = case key
|
|
42
|
+
when String then key.to_sym
|
|
43
|
+
else key
|
|
44
|
+
end
|
|
45
|
+
new_value = case value
|
|
46
|
+
when Hash then symbolize_keys(value)
|
|
47
|
+
else value
|
|
48
|
+
end
|
|
49
|
+
result[new_key] = new_value
|
|
50
|
+
result
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
# rubocop:enable Metrics/MethodLength
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
RSpec.configure do |config|
|
|
57
|
+
config.include(ConnectionHelper)
|
|
58
|
+
end
|
data/winrm-elevated.gemspec
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
require 'date'
|
|
3
|
-
|
|
4
|
-
version = File.read(File.expand_path('../VERSION', __FILE__)).strip
|
|
5
|
-
|
|
6
|
-
Gem::Specification.new do |s|
|
|
7
|
-
s.platform = Gem::Platform::RUBY
|
|
8
|
-
s.name = 'winrm-elevated'
|
|
9
|
-
s.version = version
|
|
10
|
-
s.date = Date.today.to_s
|
|
11
|
-
|
|
12
|
-
s.author = ['Shawn Neal']
|
|
13
|
-
s.email = ['sneal@sneal.net']
|
|
14
|
-
s.homepage = 'https://github.com/WinRb/winrm-elevated'
|
|
15
|
-
|
|
16
|
-
s.summary = 'Ruby library for running commands as elevated'
|
|
17
|
-
s.description = <<-EOF
|
|
18
|
-
Ruby library for running commands via WinRM as elevated through a scheduled task
|
|
19
|
-
EOF
|
|
20
|
-
s.license = 'Apache-2.0'
|
|
21
|
-
|
|
22
|
-
s.files = `git ls-files`.split(/\n/)
|
|
23
|
-
s.require_path = 'lib'
|
|
24
|
-
s.rdoc_options = %w(-x test/ -x examples/)
|
|
25
|
-
s.extra_rdoc_files = %w(README.md LICENSE)
|
|
26
|
-
|
|
27
|
-
s.required_ruby_version = '>= 1.9.0'
|
|
28
|
-
s.add_runtime_dependency 'winrm', '~>
|
|
29
|
-
s.add_runtime_dependency 'winrm-fs', '~> 0
|
|
30
|
-
s.add_development_dependency 'rspec', '~> 3.2'
|
|
31
|
-
s.add_development_dependency 'rake', '~> 10.3'
|
|
32
|
-
s.add_development_dependency 'rubocop', '~> 0.28'
|
|
33
|
-
end
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require 'date'
|
|
3
|
+
|
|
4
|
+
version = File.read(File.expand_path('../VERSION', __FILE__)).strip
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |s|
|
|
7
|
+
s.platform = Gem::Platform::RUBY
|
|
8
|
+
s.name = 'winrm-elevated'
|
|
9
|
+
s.version = version
|
|
10
|
+
s.date = Date.today.to_s
|
|
11
|
+
|
|
12
|
+
s.author = ['Shawn Neal']
|
|
13
|
+
s.email = ['sneal@sneal.net']
|
|
14
|
+
s.homepage = 'https://github.com/WinRb/winrm-elevated'
|
|
15
|
+
|
|
16
|
+
s.summary = 'Ruby library for running commands as elevated'
|
|
17
|
+
s.description = <<-EOF
|
|
18
|
+
Ruby library for running commands via WinRM as elevated through a scheduled task
|
|
19
|
+
EOF
|
|
20
|
+
s.license = 'Apache-2.0'
|
|
21
|
+
|
|
22
|
+
s.files = `git ls-files`.split(/\n/)
|
|
23
|
+
s.require_path = 'lib'
|
|
24
|
+
s.rdoc_options = %w(-x test/ -x examples/)
|
|
25
|
+
s.extra_rdoc_files = %w(README.md LICENSE)
|
|
26
|
+
|
|
27
|
+
s.required_ruby_version = '>= 1.9.0'
|
|
28
|
+
s.add_runtime_dependency 'winrm', '~> 2.0'
|
|
29
|
+
s.add_runtime_dependency 'winrm-fs', '~> 1.0'
|
|
30
|
+
s.add_development_dependency 'rspec', '~> 3.2'
|
|
31
|
+
s.add_development_dependency 'rake', '~> 10.3'
|
|
32
|
+
s.add_development_dependency 'rubocop', '~> 0.28'
|
|
33
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: winrm-elevated
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Shawn Neal
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-08-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: winrm
|
|
@@ -16,28 +16,28 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '2.0'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '2.0'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: winrm-fs
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 0
|
|
33
|
+
version: '1.0'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: 0
|
|
40
|
+
version: '1.0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rspec
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -80,8 +80,8 @@ dependencies:
|
|
|
80
80
|
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '0.28'
|
|
83
|
-
description:
|
|
84
|
-
|
|
83
|
+
description: " Ruby library for running commands via WinRM as elevated through
|
|
84
|
+
a scheduled task\n"
|
|
85
85
|
email:
|
|
86
86
|
- sneal@sneal.net
|
|
87
87
|
executables: []
|
|
@@ -102,8 +102,8 @@ files:
|
|
|
102
102
|
- appveyor.yml
|
|
103
103
|
- changelog.md
|
|
104
104
|
- lib/winrm-elevated.rb
|
|
105
|
-
- lib/winrm-elevated/runner.rb
|
|
106
105
|
- lib/winrm-elevated/scripts/elevated_shell.ps1
|
|
106
|
+
- lib/winrm/shells/elevated.rb
|
|
107
107
|
- spec/config-example.yml
|
|
108
108
|
- spec/matchers.rb
|
|
109
109
|
- spec/powershell_elevated_spec.rb
|
|
@@ -133,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
133
133
|
version: '0'
|
|
134
134
|
requirements: []
|
|
135
135
|
rubyforge_project:
|
|
136
|
-
rubygems_version: 2.
|
|
136
|
+
rubygems_version: 2.6.6
|
|
137
137
|
signing_key:
|
|
138
138
|
specification_version: 4
|
|
139
139
|
summary: Ruby library for running commands as elevated
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
#
|
|
3
|
-
# Copyright 2015 Shawn Neal <sneal@sneal.net>
|
|
4
|
-
#
|
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
# you may not use this file except in compliance with the License.
|
|
7
|
-
# You may obtain a copy of the License at
|
|
8
|
-
#
|
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
#
|
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
# See the License for the specific language governing permissions and
|
|
15
|
-
# limitations under the License.
|
|
16
|
-
|
|
17
|
-
require 'winrm'
|
|
18
|
-
require 'winrm-fs'
|
|
19
|
-
require 'securerandom'
|
|
20
|
-
|
|
21
|
-
module WinRM
|
|
22
|
-
module Elevated
|
|
23
|
-
# Runs PowerShell commands elevated via a scheduled task
|
|
24
|
-
class Runner
|
|
25
|
-
# Creates a new Elevated Runner instance
|
|
26
|
-
# @param [CommandExecutor] a winrm CommandExecutor
|
|
27
|
-
def initialize(executor)
|
|
28
|
-
@executor = executor
|
|
29
|
-
@winrm_file_transporter = WinRM::FS::Core::FileTransporter.new(executor)
|
|
30
|
-
@elevated_shell_path = 'c:/windows/temp/winrm-elevated-shell-' + SecureRandom.uuid + '.ps1'
|
|
31
|
-
@uploaded = nil
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Run a command or PowerShell script elevated without any of the
|
|
35
|
-
# restrictions that WinRM puts in place.
|
|
36
|
-
#
|
|
37
|
-
# @param [String] The command or PS script to wrap in a scheduled task
|
|
38
|
-
# @param [String] The admin user name to execute the scheduled task as
|
|
39
|
-
# @param [String] The admin user password
|
|
40
|
-
#
|
|
41
|
-
# @return [Hash] :stdout and :stderr
|
|
42
|
-
def powershell_elevated(script, username, password, &block)
|
|
43
|
-
# if an IO object is passed read it, otherwise assume the contents of the file were passed
|
|
44
|
-
script_text = script.respond_to?(:read) ? script.read : script
|
|
45
|
-
|
|
46
|
-
upload_elevated_shell_wrapper_script
|
|
47
|
-
wrapped_script = wrap_in_scheduled_task(script_text, username, password)
|
|
48
|
-
@executor.run_cmd(wrapped_script, &block)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
private
|
|
52
|
-
|
|
53
|
-
def upload_elevated_shell_wrapper_script
|
|
54
|
-
return if @uploaded
|
|
55
|
-
with_temp_file do |temp_file|
|
|
56
|
-
@winrm_file_transporter.upload(temp_file, @elevated_shell_path)
|
|
57
|
-
@uploaded = true
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def with_temp_file
|
|
62
|
-
file = Tempfile.new(['winrm-elevated-shell', 'ps1'])
|
|
63
|
-
file.write(elevated_shell_script_content)
|
|
64
|
-
file.fsync
|
|
65
|
-
file.close
|
|
66
|
-
yield file.path
|
|
67
|
-
ensure
|
|
68
|
-
file.close
|
|
69
|
-
file.unlink
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def elevated_shell_script_content
|
|
73
|
-
IO.read(File.expand_path('../scripts/elevated_shell.ps1', __FILE__))
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def wrap_in_scheduled_task(script_text, username, password)
|
|
77
|
-
ps_script = WinRM::PowershellScript.new(script_text)
|
|
78
|
-
"powershell -executionpolicy bypass -file \"#{@elevated_shell_path}\" " \
|
|
79
|
-
"-username \"#{username}\" -password \"#{password}\" -encoded_command \"#{ps_script.encoded}\""
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|