win32-certstore 0.6.1 → 0.6.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63c8c4f2aaa89a78a8123d98079710df407a3930b0f4b5a6ef3ff2232c11ba05
4
- data.tar.gz: 8641dfff337fe7b702783becfcfbfbba6b2a66af189eeb511897c2f0cb5e7d6c
3
+ metadata.gz: 809701f00c09da8b2bbcf78e30eb51d03e939d33ea7a19b17d45ce51c078fdd4
4
+ data.tar.gz: dbb26074a01b06639bbc1bae73b45f1937c54035ad57d56bbecc64a3fb377bb6
5
5
  SHA512:
6
- metadata.gz: 4f255e439feee57642565bd9fca87f19140b5f95c38eed0a1e8621326749dd5274c0b72c8211bddfbec265820bff4b8d2ad9460ebbf5c30fa1d6607a7e81f204
7
- data.tar.gz: 4efd363fb264fc8501f0f9e105e79f7537319838aafc0cb751387a73360386186d326dedd51522907aa131fe74c1b3ba07bd7b3f6f16a1283f5f59203d96a6a7
6
+ metadata.gz: 9ba534e93f989c33a735ea57f525b5357f25cbd0f7c9d2ad0bfe770a0d59f49973dde9669cfb878de35853a81d4af7257d39348d3406879273cdf338b108acd7
7
+ data.tar.gz: c16cd054c55671396b73d0d41450d89e54dd7157a7b21ea7df0dedadea67c5f376ef45b9e6a70bfaf4eb9ceadfaa520399caa0ee49fb722afec3fcef6e39d405
@@ -37,13 +37,13 @@ module Win32
37
37
  # Validate certificate Object
38
38
  def validate_certificate_obj(cert_obj)
39
39
  unless cert_obj.class == OpenSSL::X509::Certificate
40
- raise ArgumentError, "Invalid Certificate object."
40
+ raise ArgumentError, "Invalid Certificate object. This is not a properly formatted x509 object"
41
41
  end
42
42
  end
43
43
 
44
44
  # Validate thumbprint
45
45
  def validate_thumbprint(cert_thumbprint)
46
- if cert_thumbprint.nil? || cert_thumbprint.strip.empty?
46
+ if cert_thumbprint.nil? || cert_thumbprint.empty? || cert_thumbprint.strip.empty?
47
47
  raise ArgumentError, "Invalid certificate thumbprint."
48
48
  end
49
49
  end
@@ -82,7 +82,7 @@ module Win32
82
82
  # ROOT -> Root certificates.
83
83
  # SPC -> Software Publisher Certificate.
84
84
  def valid_store_name
85
- %w{MY CA ROOT AUTHROOT DISALLOWED SPC TRUST TRUSTEDPEOPLE TRUSTEDPUBLISHER CLIENTAUTHISSUER TRUSTEDDEVICES SMARTCARDROOT WEBHOSTING REMOTE\ DESKTOP}
85
+ ["MY", "CA", "ROOT", "AUTHROOT", "DISALLOWED", "SPC", "TRUST", "TRUSTEDPEOPLE", "TRUSTEDPUBLISHER", "CLIENTAUTHISSUER", "TRUSTEDDEVICES", "SMARTCARDROOT", "WEBHOSTING", "REMOTE DESKTOP"]
86
86
  end
87
87
  end
88
88
  end
@@ -21,52 +21,23 @@ module Win32
21
21
  class Certstore
22
22
  module Mixin
23
23
  module Helper
24
- # PSCommand to search certificate from thumbprint and either turn it into a pem or return a path to a pfx object
25
- def cert_ps_cmd(thumbprint, store_location: "LocalMachine", export_password: "1234", output_path: "")
24
+ def cert_ps_cmd(thumbprint, store_location: "LocalMachine", store_name: "My")
25
+ # the PowerShell block below uses a "Here-String" - it is explicitly formatted against the left margin.
26
26
  <<-EOH
27
- $cert = Get-ChildItem Cert:\'#{store_location}' -Recurse | Where { $_.Thumbprint -eq '#{thumbprint}' }
27
+ $cert = Get-ChildItem Cert:\\#{store_location}\\#{store_name} -Recurse | Where-Object { $_.Thumbprint -eq "#{thumbprint}" }
28
28
 
29
- # The function and the code below test to see if a) the cert has a private key and b) it has a
30
- # Enhanced Usage of Client Auth. Those 2 attributes would mean this is a pfx-able object
31
- function test_cert_values{
32
- $usagelist = ($cert).EnhancedKeyUsageList
33
- foreach($use in $usagelist){
34
- if($use.FriendlyName -like "Client Authentication" ){
35
- return $true
36
- }
37
- }
38
- return $false
39
- }
40
-
41
- $result = test_cert_values
42
-
43
- $output_path = "#{output_path}"
44
- if([string]::IsNullOrEmpty($output_path)){
45
- $temproot = [System.IO.Path]::GetTempPath()
46
- }
47
- else{
48
- $temproot = $output_path
49
- }
50
-
51
- if((($cert).HasPrivateKey) -and ($result -eq $true)){
52
- $file_name = '#{thumbprint}'
53
- $file_path = $(Join-Path -Path $temproot -ChildPath "$file_name.pfx")
54
- $mypwd = ConvertTo-SecureString -String '#{export_password}' -Force -AsPlainText
55
- $cert | Export-PfxCertificate -FilePath $file_path -Password $mypwd | Out-Null
56
- $file_path
57
- }
58
- else {
59
- $content = $null
60
- if($cert -ne $null)
61
- {
62
- $content = @(
63
- '-----BEGIN CERTIFICATE-----'
64
- [System.Convert]::ToBase64String($cert.RawData, 'InsertLineBreaks')
65
- '-----END CERTIFICATE-----'
66
- )
67
- }
68
- $content
29
+ $certdata = [System.Convert]::ToBase64String($cert.RawData, 'InsertLineBreaks')
30
+ $content = $null
31
+ if($null -ne $cert)
32
+ {
33
+ $content =
34
+ @"
35
+ -----BEGIN CERTIFICATE-----
36
+ $($certdata)
37
+ -----END CERTIFICATE-----
38
+ "@
69
39
  }
40
+ $content
70
41
  EOH
71
42
  end
72
43
 
@@ -36,14 +36,12 @@ module Win32
36
36
  ustring += "\000\000" if ustring.length == 0 || ustring[-1].chr != "\000"
37
37
 
38
38
  # encode it all as UTF-16LE AKA Windows Wide Character AKA Windows Unicode
39
- ustring = begin
40
- if ustring.respond_to?(:encode)
41
- ustring.encode("UTF-16LE")
42
- else
43
- require "iconv"
44
- Iconv.conv("UTF-16LE", "UTF-8", ustring)
45
- end
46
- end
39
+ ustring = if ustring.respond_to?(:encode)
40
+ ustring.encode("UTF-16LE")
41
+ else
42
+ require "iconv"
43
+ Iconv.conv("UTF-16LE", "UTF-8", ustring)
44
+ end
47
45
  ustring
48
46
  end
49
47
 
@@ -53,14 +51,12 @@ module Win32
53
51
  wstring = wstring.force_encoding("UTF-16LE") if wstring.respond_to?(:force_encoding)
54
52
 
55
53
  # encode it all as UTF-8
56
- wstring = begin
57
- if wstring.respond_to?(:encode)
58
- wstring.encode("UTF-8")
59
- else
60
- require "iconv"
61
- Iconv.conv("UTF-8", "UTF-16LE", wstring)
62
- end
63
- end
54
+ wstring = if wstring.respond_to?(:encode)
55
+ wstring.encode("UTF-8")
56
+ else
57
+ require "iconv"
58
+ Iconv.conv("UTF-8", "UTF-16LE", wstring)
59
+ end
64
60
  # remove trailing CRLF and NULL characters
65
61
  wstring.strip!
66
62
  wstring
@@ -17,20 +17,25 @@
17
17
 
18
18
  require_relative "mixin/crypto"
19
19
  require_relative "mixin/string"
20
- require_relative "mixin/shell_exec"
21
20
  require_relative "mixin/unicode"
22
21
  require "openssl" unless defined?(OpenSSL)
23
22
  require "json" unless defined?(JSON)
24
23
 
24
+ begin
25
+ require "chef-powershell"
26
+ rescue LoadError
27
+ puts "Not loading powershell_exec during testing"
28
+ end
29
+
25
30
  module Win32
26
31
  class Certstore
27
32
  module StoreBase
28
33
  include Win32::Certstore::Mixin::Crypto
29
34
  include Win32::Certstore::Mixin::Assertions
30
35
  include Win32::Certstore::Mixin::String
31
- include Win32::Certstore::Mixin::ShellExec
32
36
  include Win32::Certstore::Mixin::Unicode
33
37
  include Win32::Certstore::Mixin::Helper
38
+ include ChefPowerShell::ChefPowerShellModule::PowerShellExec
34
39
 
35
40
  # Adding new certification in open certificate and return boolean
36
41
  # store_handler => Open certificate store handler
@@ -92,9 +97,8 @@ module Win32
92
97
  thumbprint = update_thumbprint(certificate_thumbprint)
93
98
  cert_pem = get_cert_pem(thumbprint)
94
99
  cert_pem = format_pem(cert_pem)
95
- unless cert_pem.empty?
96
- build_openssl_obj(cert_pem)
97
- end
100
+ verify_certificate(cert_pem)
101
+ build_openssl_obj(cert_pem)
98
102
  end
99
103
 
100
104
  # Listing certificate of open certstore and return list in json
@@ -121,6 +125,7 @@ module Win32
121
125
  def cert_delete(store_handler, certificate_thumbprint)
122
126
  validate_thumbprint(certificate_thumbprint)
123
127
  thumbprint = update_thumbprint(certificate_thumbprint)
128
+
124
129
  cert_delete_flag = false
125
130
  begin
126
131
  cert_args = cert_find_args(store_handler, thumbprint)
@@ -141,6 +146,7 @@ module Win32
141
146
  def cert_validate(certificate_thumbprint)
142
147
  validate_thumbprint(certificate_thumbprint)
143
148
  thumbprint = update_thumbprint(certificate_thumbprint)
149
+
144
150
  cert_pem = get_cert_pem(thumbprint)
145
151
  cert_pem = format_pem(cert_pem)
146
152
  verify_certificate(cert_pem)
@@ -167,6 +173,26 @@ module Win32
167
173
  certificate_list
168
174
  end
169
175
 
176
+ # how can I find a cert if I don't have the thumbprint? This should be replaced by a call to CertFindCertificateInStore
177
+ def cert_lookup_by_token(search_token, store_name: @store_name, store_location: @store_location, timeout: -1)
178
+ raise ArgumentError, "Invalid search token" if !search_token || search_token.strip.empty?
179
+
180
+ converted_store = if store_location == CERT_SYSTEM_STORE_LOCAL_MACHINE || store_location == 131072
181
+ "LocalMachine"
182
+ else
183
+ "CurrentUser"
184
+ end
185
+ powershell_cmd = <<~EOH
186
+ $result = Get-ChildItem -Path Cert:\\#{converted_store}\\#{store_name} | Where-Object { $_.Subject -match "#{search_token.strip}" } | Select-Object Thumbprint
187
+ return $result[0].Thumbprint
188
+ EOH
189
+
190
+ powershell_exec!(powershell_cmd, :powershell, timeout: timeout).result
191
+
192
+ rescue ChefPowerShell::PowerShellExceptions::PowerShellCommandFailed
193
+ return "Certificate not found"
194
+ end
195
+
170
196
  # To close and destroy pointer of open certificate store handler
171
197
  def close_cert_store(certstore_handler = @certstore_handler)
172
198
  closed = CertCloseStore(certstore_handler, CERT_CLOSE_STORE_FORCE_FLAG)
@@ -190,6 +216,11 @@ module Win32
190
216
  [certstore_handler, cert_context, CERT_STORE_ADD_REPLACE_EXISTING, nil]
191
217
  end
192
218
 
219
+ # Remove extra space and : from thumbprint
220
+ def update_thumbprint(certificate_thumbprint)
221
+ certificate_thumbprint.gsub(/[^A-Za-z0-9]/, "")
222
+ end
223
+
193
224
  # Match certificate CN exist in cert_rdn
194
225
  def is_cn_match?(cert_rdn, certificate_name)
195
226
  cert_rdn.read_wstring.match(/(^|\W)#{certificate_name}($|\W)/i)
@@ -212,14 +243,9 @@ module Win32
212
243
  [pcert_context, search_type, CERT_NAME_ISSUER_FLAG, nil, cert_name, 1024]
213
244
  end
214
245
 
215
- # Remove extra space and : from thumbprint
216
- def update_thumbprint(certificate_thumbprint)
217
- certificate_thumbprint.gsub(/[^A-Za-z0-9]/, "")
218
- end
219
-
220
246
  # Verify OpenSSL::X509::Certificate object
221
247
  def verify_certificate(cert_pem)
222
- return "Certificate not found" if cert_pem.empty?
248
+ raise ArgumentError, "Certificate not found" if cert_pem.empty?
223
249
 
224
250
  valid_duration?(build_openssl_obj(cert_pem))
225
251
  end
@@ -229,26 +255,17 @@ module Win32
229
255
  FFI::MemoryPointer.from_string(cert_obj.to_der)
230
256
  end
231
257
 
232
- # Get certificate pem
233
- def get_cert_pem(thumbprint)
234
- converted_store = if @store_location == CERT_SYSTEM_STORE_LOCAL_MACHINE
235
- "LocalMachine"
236
- else
237
- "CurrentUser"
238
- end
239
- get_data = powershell_exec!(cert_ps_cmd(thumbprint, store_location: converted_store))
240
- get_data.stdout
241
- end
242
-
243
- # Get PFX object
244
- def get_cert_pfx(thumbprint, store_location: CERT_SYSTEM_STORE_LOCAL_MACHINE, export_password:, output_path: )
245
- converted_store = if store_location == CERT_SYSTEM_STORE_LOCAL_MACHINE
258
+ # Get certificate pem.
259
+ def get_cert_pem(thumbprint, store_name: @store_name, store_location: @store_location, timeout: -1)
260
+ converted_store = if store_location == CERT_SYSTEM_STORE_LOCAL_MACHINE || store_location == 131072
246
261
  "LocalMachine"
247
262
  else
248
263
  "CurrentUser"
249
264
  end
250
- get_data = powershell_exec!(cert_ps_cmd(thumbprint, export_password: export_password, store_location: converted_store, output_path: output_path))
251
- get_data.stdout
265
+ get_data = powershell_exec!(cert_ps_cmd(thumbprint, store_location: converted_store, store_name: store_name), :powershell, timeout: timeout)
266
+ get_data.result
267
+ rescue ChefPowerShell::PowerShellExceptions::PowerShellCommandFailed
268
+ raise ArgumentError, "PowerShell threw an error retreiving the certificate. You asked for a cert with this thumbprint : #{thumbprint}, located in this store : #{store_name}, at this location : #{store_location}"
252
269
  end
253
270
 
254
271
  # Format pem
@@ -1,6 +1,6 @@
1
1
  module Win32
2
2
  class Certstore
3
- VERSION = "0.6.1".freeze
3
+ VERSION = "0.6.11".freeze
4
4
  MAJOR, MINOR, TINY = VERSION.split(".")
5
5
  end
6
6
  end
@@ -29,23 +29,23 @@ module Win32
29
29
  include Win32::Certstore::Mixin::String
30
30
  include Win32::Certstore::StoreBase
31
31
 
32
- attr_accessor :store_name
32
+ attr_accessor :store_name, :store_location
33
33
 
34
34
  # Initializes a new instance of a certificate store.
35
35
  # takes 2 parameters - the store name (My, Root, etc) and the location (CurrentUser or LocalMachine), it defaults to LocalMachine for backwards compatibility
36
- def initialize(store_name, store_location: CERT_SYSTEM_STORE_LOCAL_MACHINE)
36
+ def initialize(store_name, store_location)
37
37
  @store_name = store_name
38
38
  @store_location = store_location
39
- @certstore_handler = open(store_name, store_location: store_location)
39
+ @certstore_handler = open(store_name, store_location)
40
40
  end
41
41
 
42
42
  # To open given certificate store
43
43
  def self.open(store_name, store_location: CERT_SYSTEM_STORE_LOCAL_MACHINE)
44
44
  validate_store(store_name)
45
45
  if block_given?
46
- yield new(store_name, store_location: store_location)
46
+ yield new(store_name, store_location)
47
47
  else
48
- new(store_name, store_location: store_location)
48
+ new(store_name, store_location)
49
49
  end
50
50
  end
51
51
 
@@ -78,16 +78,15 @@ module Win32
78
78
  cert_get(certificate_thumbprint)
79
79
  end
80
80
 
81
- # Returns a filepath to a PKCS12 container. The filepath is in a temporary folder so normal housekeeping by the OS should clear it.
82
- # However, you should delete it yourself anyway.
83
- # @param certificate_thumbprint [String] Is the thumbprint of the pfx blob you want to capture
84
- # @param store_location: [String] A location in the Cert store where the pfx is located, typically 'LocalMachine'
85
- # @param export_password: [String] The password to export with. P12 objects are an encrypted container that have a private key in \
86
- # them and a password is required to export them.
87
- # @param output_path: [String] The path where the you want P12 exported to.
88
- # @return [Object] of certificate set in PKSC12 format at the path specified above
89
- def get_pfx(certificate_thumbprint, store_location: @store_location, export_password:, output_path: "")
90
- get_cert_pfx(certificate_thumbprint, store_location: store_location, export_password: export_password, output_path: output_path)
81
+ # Return `OpenSSL::X509` certificate object if present otherwise raise a "Certificate not found!" error
82
+ # @param request [thumbprint<string>] of certificate
83
+ # @return [Object] of certificates in OpenSSL::X509 format
84
+ def get!(certificate_thumbprint)
85
+ cert_pem = cert_get(certificate_thumbprint)
86
+
87
+ raise ArgumentError, "Unable to retrieve the certificate" if cert_pem.empty?
88
+
89
+ cert_pem
91
90
  end
92
91
 
93
92
  # Returns all the certificates in a store
@@ -111,11 +110,21 @@ module Win32
111
110
  cert_search(certstore_handler, search_token)
112
111
  end
113
112
 
113
+ def get_thumbprint(search_token)
114
+ cert_lookup_by_token(search_token)
115
+ end
116
+
114
117
  # Validates a certificate in a certificate store on the basis of time validity
115
118
  # @param request[thumbprint<string>] of certificate
116
119
  # @return [true, false] only true or false
117
120
  def valid?(certificate_thumbprint)
118
- cert_validate(certificate_thumbprint)
121
+ cert_validate(certificate_thumbprint).yield_self do |x|
122
+ if x.is_a?(TrueClass) || x.is_a?(FalseClass)
123
+ x
124
+ else
125
+ false
126
+ end
127
+ end
119
128
  end
120
129
 
121
130
  # To close and destroy pointer of open certificate store handler
@@ -134,7 +143,7 @@ module Win32
134
143
 
135
144
  # To open certstore and return open certificate store pointer
136
145
 
137
- def open(store_name, store_location: CERT_SYSTEM_STORE_LOCAL_MACHINE)
146
+ def open(store_name, store_location)
138
147
  certstore_handler = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, nil, store_location, wstring(store_name))
139
148
  unless certstore_handler
140
149
  last_error = FFI::LastError.error
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: win32-certstore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-04 00:00:00.000000000 Z
11
+ date: 2022-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: mixlib-shellout
42
+ name: ffi
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,19 +53,19 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: ffi
56
+ name: chef-powershell
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 1.0.12
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 1.0.12
69
69
  description:
70
70
  email:
71
71
  - oss@chef.io
@@ -79,7 +79,6 @@ files:
79
79
  - lib/win32/certstore/mixin/assertions.rb
80
80
  - lib/win32/certstore/mixin/crypto.rb
81
81
  - lib/win32/certstore/mixin/helper.rb
82
- - lib/win32/certstore/mixin/shell_exec.rb
83
82
  - lib/win32/certstore/mixin/string.rb
84
83
  - lib/win32/certstore/mixin/unicode.rb
85
84
  - lib/win32/certstore/store_base.rb
@@ -1,105 +0,0 @@
1
- #
2
- # Author:: Daniel DeLeo (<dan@chef.io>)
3
- # Copyright:: Copyright (c) 2017 Chef Software, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- require "mixlib/shellout" unless defined?(Mixlib::ShellOut)
19
-
20
- module Win32
21
- class Certstore
22
- module Mixin
23
- module ShellExec
24
- def shell_out_command(*command_args)
25
- cmd = Mixlib::ShellOut.new(*command_args)
26
- cmd.live_stream
27
- cmd.run_command
28
- if cmd.error!
29
- raise Mixlib::ShellOut::ShellCommandFailed, cmd.error!
30
- end
31
-
32
- cmd
33
- end
34
-
35
- # Run a command under powershell with the same API as shell_out. The
36
- # options hash is extended to take an "architecture" flag which
37
- # can be set to :i386 or :x86_64 to force the windows architecture.
38
- #
39
- # @param script [String] script to run
40
- # @param options [Hash] options hash
41
- # @return [Mixlib::Shellout] mixlib-shellout object
42
- def powershell_exec(*command_args)
43
- script = command_args.first
44
- options = command_args.last.is_a?(Hash) ? command_args.last : nil
45
-
46
- run_command_with_os_architecture(script, options)
47
- end
48
-
49
- # Run a command under powershell with the same API as shell_out!
50
- # (raises exceptions on errors)
51
- #
52
- # @param script [String] script to run
53
- # @param options [Hash] options hash
54
- # @return [Mixlib::Shellout] mixlib-shellout object
55
- def powershell_exec!(*command_args)
56
- cmd = powershell_exec(*command_args)
57
- cmd.error!
58
- cmd
59
- end
60
-
61
- private
62
-
63
- # Helper function to run shell_out and wrap it with the correct
64
- # flags to possibly disable WOW64 redirection (which we often need
65
- # because chef-client runs as a 32-bit app on 64-bit windows).
66
- #
67
- # @param script [String] script to run
68
- # @param options [Hash] options hash
69
- # @return [Mixlib::Shellout] mixlib-shellout object
70
- def run_command_with_os_architecture(script, options)
71
- options ||= {}
72
- options = options.dup
73
-
74
- shell_out_command(
75
- build_powershell_command(script),
76
- options
77
- )
78
- end
79
-
80
- # Helper to build a powershell command around the script to run.
81
- #
82
- # @param script [String] script to run
83
- # @return [String] powershell command to execute
84
- def build_powershell_command(script)
85
- flags = [
86
- # Hides the copyright banner at startup.
87
- "-NoLogo",
88
- # Does not present an interactive prompt to the user.
89
- "-NonInteractive",
90
- # Does not load the Windows PowerShell profile.
91
- "-NoProfile",
92
- # always set the ExecutionPolicy flag
93
- # see http://technet.microsoft.com/en-us/library/ee176961.aspx
94
- "-ExecutionPolicy Unrestricted",
95
- # Powershell will hang if STDIN is redirected
96
- # http://connect.microsoft.com/PowerShell/feedback/details/572313/powershell-exe-can-hang-if-stdin-is-redirected
97
- "-InputFormat None",
98
- ]
99
-
100
- "powershell.exe #{flags.join(" ")} -Command \"#{script.gsub('"', '\"')}\""
101
- end
102
- end
103
- end
104
- end
105
- end