uac 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +7 -0
  2. data/bin/uac +11 -0
  3. data/bin/uacs +11 -0
  4. data/lib/uac.rb +106 -0
  5. data/lib/uac_sh.rb +89 -0
  6. metadata +49 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 37528e1860f9e3fda920e2edbb5132b706455a6b
4
+ data.tar.gz: d81a019f32dacc8228d85b73da5419f1912a3498
5
+ SHA512:
6
+ metadata.gz: 3943141310485d72528db7d4621a82b88cee357f64be29ff555e8059c4863d73c0a6160636e90b30d687d936de8e8af8650682b88febf3fe0fa80d73ad431bd9
7
+ data.tar.gz: 4a044333ff2315d10b94eefa82fe3e8d110680af89e635a9fa0f87472db608c236ff3b2661b04936faadb992912dbf8613d2399d4bc126cb2a63b6b4013db3c0
data/bin/uac ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'uac_sh'
4
+
5
+ options = {
6
+ :pause => true,
7
+ :terminal => true,
8
+ :cd => true
9
+ }
10
+
11
+ UacSh.run options, ARGV
data/bin/uacs ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'uac_sh'
4
+
5
+ options = {
6
+ :pause => false,
7
+ :terminal => false,
8
+ :cd => false
9
+ }
10
+
11
+ UacSh.run options, ARGV
data/lib/uac.rb ADDED
@@ -0,0 +1,106 @@
1
+ require 'ffi'
2
+ require 'optparse'
3
+
4
+ module Uac
5
+ class UacPrivate
6
+ def encode_arg arg
7
+ s = arg.gsub /(\\+)"/, "#{$1}#{$1}\""
8
+ s = s.gsub /(\\+)$"/, "#{$1}#{$1}"
9
+ if s.match /\s/
10
+ s = "\"" + s + "\""
11
+ end
12
+ return s
13
+ end
14
+
15
+ def get_long_arg args
16
+ return args.map do |arg|
17
+ encode_arg arg
18
+ end.join " "
19
+ end
20
+
21
+ def join_long_args args, separator = " "
22
+ result = []
23
+ for arg in args
24
+ m = arg.match /^"(.+?)"$/
25
+ if m
26
+ core = m.captures[0]
27
+ else
28
+ core = arg
29
+ end
30
+ result << core
31
+ end
32
+ return result.join separator
33
+ end
34
+
35
+ def join_args options, args
36
+ if options[:terminal]
37
+ file = "cmd"
38
+ rest_args = args
39
+ else
40
+ file = args[0]
41
+ rest_args = args[1..-1]
42
+ end
43
+
44
+ rest = get_long_arg rest_args
45
+
46
+ if options[:cd]
47
+ pre = get_long_arg [ 'cd', '/d', Dir.pwd, '&' ]
48
+ rest = join_long_args [ pre, rest ]
49
+ end
50
+
51
+ if options[:pause]
52
+ post = get_long_arg([ '&', 'pause' ])
53
+ rest = join_long_args [ rest, post ]
54
+ end
55
+
56
+ if options[:terminal]
57
+ rest = "/c \"#{rest}\""
58
+ end
59
+
60
+ if options[:debug]
61
+ puts "file: #{file}"
62
+ puts "rest: #{rest}"
63
+ end
64
+
65
+ return [file, rest]
66
+ end
67
+ end
68
+
69
+ module Shell32
70
+ extend FFI::Library
71
+
72
+ ffi_lib 'shell32'
73
+ ffi_convention :stdcall
74
+
75
+ # HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd)
76
+ attach_function :ShellExecuteA, [ :pointer, :pointer, :pointer, :pointer, :pointer, :int ], :pointer
77
+
78
+ SW_HIDE = 0
79
+ SW_SHOWNORMAL = 1
80
+ SW_SHOWMINIMIZED = 2
81
+ SW_SHOWMAXIMIZED = 3
82
+ SW_SHOWNOACTIVATE = 4
83
+ SW_SHOW = 5
84
+ SW_MINIMIZE = 6
85
+ SW_SHOWMINNOACTIVE = 7
86
+ SW_SHOWNA = 8
87
+ SW_RESTORE = 9
88
+ SW_SHOWDEFAULT = 10
89
+ end
90
+
91
+ def self.shell_execute options, args
92
+ uac_private = UacPrivate.new
93
+
94
+ (file, rest) = uac_private.join_args options, args
95
+
96
+ verb = options[:verb] || "runas"
97
+
98
+ Shell32.ShellExecuteA(
99
+ nil,
100
+ FFI::MemoryPointer.from_string(verb),
101
+ FFI::MemoryPointer.from_string(file),
102
+ FFI::MemoryPointer.from_string(rest),
103
+ FFI::MemoryPointer.from_string(Dir.pwd),
104
+ Shell32::SW_SHOWNORMAL)
105
+ end
106
+ end
data/lib/uac_sh.rb ADDED
@@ -0,0 +1,89 @@
1
+ require_relative 'uac'
2
+
3
+ module UacSh
4
+ def self.split_args args
5
+ i = args.index '--'
6
+ if i
7
+ return [ args[0...i], args[(i+1)..-1] ]
8
+ else
9
+ return [ [], args ]
10
+ end
11
+ end
12
+
13
+ def self.parse_meta_args options, args
14
+ option_parser = OptionParser.new do |opt|
15
+ opt.banner = <<-EOF
16
+ Usage: uac <OPTIONS> <COMMAND>
17
+
18
+ For examples please see https://github.com/winteryoung/uac
19
+ EOF
20
+
21
+ opt.separator ""
22
+ opt.separator "Options:"
23
+
24
+ terminal_help = 'The given command will be executed in a terminal window, so cmd /c is added implictly. This is enabled by default.'
25
+ opt.on('-t', '--[no-]terminal', terminal_help) do |o|
26
+ options[:terminal] = o
27
+ if not o
28
+ options[:pause] = o
29
+ options[:cd] = o
30
+ end
31
+ end
32
+
33
+ pause_help = 'Pause after execution. This implies executing command line, so cmd.exe is the program to be executed. This option implies --terminal. This is enabled by default.'
34
+ opt.on('-p', '--[no-]pause', pause_help) do |o|
35
+ options[:pause] = o
36
+ if o
37
+ options[:terminal] = o
38
+ end
39
+ end
40
+
41
+ opt.on('--debug') do |o|
42
+ options[:debug] = o
43
+ end
44
+
45
+ opt.on('--cd', '-c', 'Change to current directory. Default is true. This option implies --terminal.') do |o|
46
+ options[:cd] = o
47
+ if o
48
+ options[:terminal] = o
49
+ end
50
+ end
51
+
52
+ opt.on_tail('-h', '--help', 'Print this help.') do |o|
53
+ puts opt
54
+ exit
55
+ end
56
+ end.parse! args
57
+ end
58
+
59
+ def self.run options, args
60
+ (meta_args, args) = split_args args
61
+
62
+ all_options = args.all? do |arg|
63
+ arg.start_with? "-"
64
+ end
65
+ if all_options
66
+ meta_args = args
67
+ args = []
68
+ end
69
+
70
+ options = {
71
+ :pause => true,
72
+ :terminal => true,
73
+ :cd => true
74
+ }.merge options
75
+
76
+ parse_meta_args options, meta_args
77
+
78
+ if options[:debug]
79
+ puts "options: #{options}"
80
+ puts "args: #{args}"
81
+ end
82
+
83
+ if not args or args.empty?
84
+ exit
85
+ end
86
+
87
+ Uac.shell_execute options, args
88
+ end
89
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: uac
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Winter Young
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-19 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Executes commands with elevated privilege in Windows
14
+ email: 513805252@qq.com
15
+ executables:
16
+ - uac
17
+ - uacs
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - bin/uac
22
+ - bin/uacs
23
+ - lib/uac.rb
24
+ - lib/uac_sh.rb
25
+ homepage: https://github.com/winteryoung/uac
26
+ licenses:
27
+ - Apache-2.0
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 2.6.1
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: Windows UAC elevator
49
+ test_files: []