diff --git a/lib/ansible/modules/windows/win_shell.ps1 b/lib/ansible/modules/windows/win_shell.ps1 index 47b5dfb9bf1..f0542a8e211 100644 --- a/lib/ansible/modules/windows/win_shell.ps1 +++ b/lib/ansible/modules/windows/win_shell.ps1 @@ -47,6 +47,7 @@ $executable = Get-AnsibleParam -obj $params -name "executable" -type "path" $creates = Get-AnsibleParam -obj $params -name "creates" -type "path" $removes = Get-AnsibleParam -obj $params -name "removes" -type "path" $stdin = Get-AnsibleParam -obj $params -name "stdin" -type "str" +$no_profile = Get-AnsibleParam -obj $params -name "no_profile" -type "bool" -default $false $raw_command_line = $raw_command_line.Trim() @@ -78,6 +79,10 @@ If(-not $executable -or $executable -eq "powershell") { } else { $exec_args = "-noninteractive -encodedcommand $encoded_command" } + + if ($no_profile) { + $exec_args = "-noprofile $exec_args" + } } Else { # FUTURE: support arg translation from executable (or executable_args?) to process arguments for arbitrary interpreter? diff --git a/lib/ansible/modules/windows/win_shell.py b/lib/ansible/modules/windows/win_shell.py index cbec4bd0020..4f84743811d 100644 --- a/lib/ansible/modules/windows/win_shell.py +++ b/lib/ansible/modules/windows/win_shell.py @@ -47,6 +47,13 @@ options: - Set the stdin of the command directly to the specified value. type: str version_added: '2.5' + no_profile: + description: + - Do not load the user profile before running a command. This is only valid + when using PowerShell as the executable. + type: bool + default: no + version_added: '2.8' notes: - If you want to run an executable securely and predictably, it may be better to use the M(win_command) module instead. Best practices when writing diff --git a/test/integration/targets/win_shell/tasks/main.yml b/test/integration/targets/win_shell/tasks/main.yml index 867fe237dd0..eb388b5b11a 100644 --- a/test/integration/targets/win_shell/tasks/main.yml +++ b/test/integration/targets/win_shell/tasks/main.yml @@ -257,3 +257,31 @@ - nonascii_output.stdout_lines|count == 1 - nonascii_output.stdout_lines[0] == 'über den Fußgängerübergang gehen' - nonascii_output.stderr == '' + +- name: execute powershell without no_profile + win_shell: '[System.Environment]::CommandLine' + register: no_profile + +- name: assert execute powershell with no_profile + assert: + that: + - no_profile is successful + - no_profile is changed + - no_profile.cmd == "[System.Environment]::CommandLine" + - no_profile.rc == 0 + - no_profile.stdout is match ('^powershell.exe -noninteractive -encodedcommand') + +- name: execute powershell with no_profile + win_shell: '[System.Environment]::CommandLine' + args: + no_profile: yes + register: no_profile + +- name: assert execute powershell with no_profile + assert: + that: + - no_profile is successful + - no_profile is changed + - no_profile.cmd == "[System.Environment]::CommandLine" + - no_profile.rc == 0 + - no_profile.stdout is match ('^powershell.exe -noprofile -noninteractive -encodedcommand')