7

I am trying to use Powershell to provision a Windows Vagrant machine. I've verified that my script works on my local machine if I launch Powershell as an Administrator. During the Vagrant provisioning process, the vagrant user cannot elevate and run the script.

I know powershell scripts are supported with Vagrant, so what needs to happen to use them for provisioning? My initial thought is try to have the script to launch an new Administrator Powershell, but I feel there must be a better way.

I'm trying to just download a file using System.Net.WebClient and using msiexec to install.

Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
PROVISION_WIN7_SCRIPT = "provision_win7.ps1"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "win7", primary: false do |win7|
  config.vm.provision "shell", :path => "#{PROVISION_WIN7_SCRIPT}"
  config.vm.box      = "win7"
  config.vm.hostname = "win7"
  config.vm.communicator = "winrm"
  config.vm.network :private_network, ip: "10.10.10.10"
  config.vm.box_url = "https://atlas.hashicorp.com/designerror/boxes/windows-7/versions/1.0/providers/virtualbox.box"   
    config.vm.provider :virtualbox do |vb|
      vb.gui = true
      vb.customize ["modifyvm", :id, "--memory", 1024]
      vb.customize ["modifyvm", :id, "--cpus", 1]
      vb.customize ["modifyvm", :id, "--vram", "32"]
      vb.customize ["modifyvm", :id, "--clipboard", "bidirectional"]
      vb.customize ["setextradata", "global", "GUI/SuppressMessages", "all" ]
  end
  end
end

Edit:

I tried this again today using what I was running at the time: Vagrant 1.6.3, Virtualbox 4.3.30. When I bring up my vagrant box, I do not see any error output:

Bringing machine 'win7' up with 'virtualbox' provider...
==> win7: Importing base box 'designerror/windows-7'...
==> win7: Matching MAC address for NAT networking...
==> win7: Checking if box 'designerror/windows-7' is up to date...
==> win7: Setting the name of the VM: vagrant_win7_1453859492744_23074
==> win7: Clearing any previously set network interfaces...
==> win7: Preparing network interfaces based on configuration...
    win7: Adapter 1: nat
    win7: Adapter 2: hostonly
==> win7: Forwarding ports...
    win7: 3389 => 3389 (adapter 1)
    win7: 22 => 2222 (adapter 1)
    win7: 5985 => 55985 (adapter 1)
==> win7: Running 'pre-boot' VM customizations...
==> win7: Booting VM...
==> win7: Waiting for machine to boot. This may take a few minutes...
==> win7: Machine booted and ready!
==> win7: Checking for guest additions in VM...
==> win7: Setting hostname...
==> win7: Configuring and enabling network interfaces...
==> win7: Mounting shared folders...
    win7: /vagrant => /Users/dstark/Projects/itbestprac-pres/vagrant
==> win7: Running provisioner: shell...
    win7: Running: c:\tmp\vagrant-shell.ps1

On my vagrant box under c:\tmp there's a vagrant-shell.ps1 and vagrant-elevated-shell.ps1 and if I manually execute the vagrant generated elevated shell ps script as the vagrant user it installs. So, I think my script is ok.

If I add the config.winrm.username and config.winrm.password I still am not able to elevate permissions necessary to run the script. There's also nothing telling in the Event Viewer.

Dan Stark
  • 808
  • 1
  • 9
  • 23
  • for download file is better way you use `Invoke-WebRequest` ex:`Invoke-WebRequest -Uri "http://stackoverflow.com" -OutFile index.html` affter you download you can use `msiexec` for install that – Soheil Mar 23 '15 at 19:17
  • Do you get any particular error? – Anthony Mastrean Jan 20 '16 at 18:23
  • Normally you would set `config.winrm.username` and `config.winrm.password` to a user with admin access. – Eris Jan 20 '16 at 18:29
  • @Eris I tried adding this when revisiting this issue but it did not seem to help on my Vagrant version 1.6.3 -- I'm going to try updating to the latest. – Dan Stark Jan 27 '16 at 03:15

1 Answers1

2

Possibly you need to add the privileged flag to the provision line:

config.vm.provision "shell", path: "scripts/provision.ps1", privileged: true

Or in your case:

config.vm.provision "shell", :path => "#{PROVISION_WIN7_SCRIPT}", privileged: true
Eris
  • 7,378
  • 1
  • 30
  • 45