IT:AD:Windows:HowTo:Automate the Configuration
Summary
You can spend all day doing it by hand, or work smart, using IT:AD:Powershell, IT:AD:Chocolatey, IT:AD:NPM, etc. to download and install the tools you will need.
Script
Usage:
Remove-Module "initialize-tools" Import-Module "./initialize-tools.ps1" cls Initialize-Tools
The instructions are pretty straightforward:
PS C:\tmp\Scripts> Initialize-Tools -------------------------------------------------------------------------------- INSTRUCTIONS: Work with the following flags to change what is installed: eg: Initialize-Tools -go -isWorkstation -isDevWorkstation Flags: -isWorkstation: False -isDevWorkstation: False -isMediaWorkstation: False -isServer: False -isCIServer: False -visualServerVersion: Professional [Universal|Professional|Community] -ciServiceAccountName: Svc-CI -ciServiceAccountPassword: (Must be set, or step skipped) When ready, set the 'go' flag to actually install, rather than dry run: -go: False --------------------------------------------------------------------------------
File Contents
function EnsureAppsDirectory(){ md -Force c:\APPS } function CreateLinuxHOMEEnvironmentVariable(){ if (!$Env:HOME) { echo "Creating HOME Env variable.fsenv " [Environment]::SetEnvironmentVariable("HOME", $Env:UserProfile, "User") } } function InstallChocolatey(){ if (!$Env:path.ToLower().Contains("chocolatey".ToLower())) { iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')) $tmpPath = [Environment]::GetEnvironmentVariable("TestVariable","Path","User"); [Environment]::SetEnvironmentVariable("Path", $tmpPath + ";%ALLUSERSPROFILE%\chocolatey\bin", "User") } RefreshEnvironmentVariables } function Initialize-Tools([switch]$go, [switch]$isWorkstation, [switch]$isDevWorkstation, [switch]$isMediaWorkstation, [switch]$isServer, [switch]$isCIServer, [string]$visualServerVersion="Professional", [string]$ciServiceAccountName="Svc-CI", [string]$ciServiceAccountPassword){ Write-Host "--------------------------------------------------------------------------------" Write-Host "INSTRUCTIONS:" Write-Host "Work with the following flags to change what's installed:" Write-Host "eg: Initialize-Tools -go -isWorkstation -isDevWorkstation" Write-Host "" Write-Host "Flags:" Write-Host "-isWorkstation: $isWorkstation" Write-Host "-isDevWorkstation: $isDevWorkstation" Write-Host "-isMediaWorkstation: $isMediaWorkstation" Write-Host "-isServer: $isServer" Write-Host "-isCIServer: $isCIServer" Write-Host "-visualServerVersion: $visualServerVersion [Universal|Professional|Community]" Write-Host "-ciServiceAccountName: $ciServiceAccountName" Write-Host "-ciServiceAccountPassword: $ciServiceAccountPassword (Must be set, or step skipped)" Write-Host "" Write-Host "When ready, set the 'go' flag to actually install, rather than dry run:" Write-Host "-go: $go" Write-Host "--------------------------------------------------------------------------------" CreateGlobalSpecs -go:$go -isWorkstation:$isWorkstation -isDevWorkstation:$isDevWorkstation -isMediaWorkstation:$isMediaWorkstation -isServer:$isServer -isCIServer:$isCIServer -visualServerVersion:$visualServerVersion -ciServiceAccountName:$ciServiceAccountName -ciServiceAccountPassword:$ciServiceAccountPassword LogicalChecksForGlobalSpecs if ($specs.InstallCommonTools -eq $false){ return; } EnsureAppsDirectory Install_Workstation_Containers Install_Common_Runtimes RefreshEnvironmentVariables Install_Common_CompressionTools Install_Common_PackageManagementTools Install_Common_PackageDeploymentTools Install_Common_SourceControlTools Install_Common_DiagnosticsTools Install_Common_NetworkClientTools Install_Common_WindowsServiceTools Install_Common_BasicDesktopTools Install_Common_ProductivityTools Install_Workstation_Productivity_Tools Install_Workstation_Browsers Install_Workstation_RemoteAccessTools Install_Workstation_DevTools Install_Workstation_Misc Install_Server_OpenSourceCITools Install_Server_CIServiceAccount RefreshEnvironmentVariables #from : githum/msysgit... } function RefreshEnvironmentVariables(){ # after installing some applications # we need to re-import the PATH so that # subsequent operations work correctly. RefreshEnv } function CreateGlobalSpecs([switch]$go, [switch]$isWorkstation, [switch]$isDevWorkstation, [switch]$isMediaWorkstation, [switch]$isServer, [switch]$isCIServer, [string]$visualServerVersion="Professional", [string]$ciServiceAccountName="Svc-CI", [string]$ciServiceAccountPassword){ if (Test-Path variable:global:specs){ [hashtable]$global:specs = @{} # Array to track what is to be installed/excluded from installation: $specs.Install = @{}; } $specs.TestRun = !$go; #Array to keep track of what's been installed. $specs.Installed = @{}; # if you install VS, use the following license: $specs.VisualStudioVersion = $visualServerVersion; #[Ultimate|Professional|Community] $specs.InstallCommonTools = $false; $specs.InstallWorkstationTools = $isWorkstation; $specs.InstallWorkstationDevTools = $isDevWorkstation; $specs.InstallWorkstationMiscTools = $isMediaWorkstation; $specs.InstallServerTools = $isServer; $specs.InstallServerCITools = $isCIServer; $specs.Accounts = @{}; $specs.Accounts.CIServiceAccountName = $ciServiceAccountName; $specs.Accounts.CIServiceAccountPassword = $ciServiceAccountPassword; #TODO: #SET JAVA_HOME:C:\Program Files (x86)\Java\jre6 #And that it the path to java is part of the PATH Environment Variable: #Append to PATH:%JAVA_HOME%\bin\ } function LogicalChecksForGlobalSpecs(){ if (($specs.InstallWorkstationMiscTools -eq $true) -or ($specs.InstallWorkstationDevTools -eq $true)) { $specs.InstallWorkstationTools=$true;} if ($specs.InstallServerCITools -eq $true) { $specs.InstallServerTools=$true;} if (($specs.InstallWorkstationTools -eq $true) -or ($specs.InstallServerTools -eq $true)){ $specs.InstallCommonTools = $true;} } function Install_Package ([string]$packageName, [string]$flagName, [string]$version){ if (!$flagName){ $flagName = $packageName -replace "\W", ""; } if ($specs.Install.$flagName -ne $false){ if ($specs.TestRun -eq $true){ Write-Host("TestRun: would install $packageName (flagName: $flagName)") } else { choco install $packageName -y -version $version } $specs.Installed.$flagName = $true; }else{ Write-Host("Skipping $packageName") } } function Install_Workstation_Containers(){ if ($specs.InstallCommonTools -eq $false){ return; } Install_Package -packageName:"vagrant"; } function Install_Common_Runtimes(){ if ($specs.InstallCommonTools -eq $false){ return; } Install_Package -packageName:"dotnet4.5" -flagName:"net"; # maybe a bit controversial. # Does everybody need the full # versus just the RTE? Probably not. But it's # easier to manage one install than two (RTE, # and also JDK) Install_Package -packageName:"jdk8" -flagName:"java"; # Not just for devs -- many admin tools # are moving to/adding Node Install_Package -packageName:"nodejs"; Install_Package -packageName:"python"; # Not as common as NodeJS, but # required by front end developers and build # engines for Compass, etc. Install_Package -packageName:"ruby"; } function Install_Common_CompressionTools(){ if ($specs.InstallCommonTools -eq $false){ return; } # Windows Zip features have improved over the years. # But still have to deal with packages that are not # *.zip. Install_Package -packageName:"7zip.install" -flagName:"sevenzipinstall"; } function Install_Common_PackageManagementTools(){ if ($specs.InstallCommonTools -eq $false){ return; } Install_Package -package:"nugetpackageexplorer"; Install_Package -package:"chocolateypackageupdater"; Install_Package -package:"chocolateygui"; Install_Package -package:"nuget.commandline" -flagName:"nuget.commandline"; } function Install_Common_PackageDeploymentTools(){ if ($specs.InstallCommonTools -eq $false){ return; } #msdeploy is the only official microsoft deployment mechanism at present: Install_Package -packageName:"webdeploy"; } function Install_Common_SourceControlTools(){ if ($specs.InstallCommonTools -eq $false){ return; } # although it may seem at first strange to install source control # tools on servers, more and more packaging solutions are directly # retrieving script files from remote stable repositories. Install_Git Install_Package -packageName:"hg"; RefreshEnvironmentVariables } function Install_Git(){ if ($specs.InstallCommonTools -eq $false){ return; } #hack due to: http://stackoverflow.com/a/29305866 Install_Package -packageName:"git.install" -flagName:"gitinstall" -version:"1.9.5.20150114"; } function Install_Common_DiagnosticsTools(){ if ($specs.InstallCommonTools -eq $false){ return; } Install_Package -packageName:"linqpad"; Install_Package -packageName:"fiddler"; Install_Package -packageName:"wireshark"; #takes surprisingly long to download: Install_Package -packageName:"microsoft-message-analyzer" -flagName:"microsoftmessageanalyzer"; Install_Package -packageName:"logparser"; Install_Package -packageName:"logparser.lizardgui" -flagName:"lizardgui"; Install_Package -packageName:"sysinternals"; } function Install_Common_NetworkClientTools(){ if ($specs.InstallCommonTools -eq $false){ return; } # ssh: Install_Package -packageName:"putty.install" -flagName:"putty"; # ftp: Install_Package -packageName:"filezilla"; # installation scripts on servers, and developer testing on workstations: Install_Package -packageName:"curl"; Install_Package -packageName:"wget"; Install_Package -packageName:"wput"; } function Install_Common_WindowsServiceTools(){ if ($specs.InstallCommonTools -eq $false){ return; } # Build servers use services. # Configuring services in Windows # is unnecessarily difficult. Install_Package -packageName:"nssm"; } function Install_Common_BasicDesktopTools(){ if ($specs.InstallCommonTools -eq $false){ return; } # Window's notepad sucks. # Whether you're a developer or not. Install_Package -packageName:"notepadplusplus.install" -flagName:"notepadplusplus"; Install_Package -packageName:"paint.net" -flagName:"paintnet"; Install_Package -package:"foxitreader"; } function Install_Common_ProductivityTools(){ if ($specs.InstallCommonTools -eq $false){ return; } Install_Package -package:"wincommandpaste"; } function Install_Workstation_Productivity_Tools(){ if ($specs.InstallWorkstationTools -eq $false){ return; } #virtual kvm for developers managing # multiple stations (eg, personal laptop and client workstation): Install_Package -packageName:"synergy"; } function Install_Workstation_Browsers(){ if ($specs.InstallWorkstationTools -eq $false){ return; } Install_Package -packageName:"google-chrome-x64" -flagName:"chrome"; } function Install_Workstation_RemoteAccessTools(){ if ($specs.InstallWorkstationTools -eq $false){ return; } #nobody seems to agree which one is the best, so since they're all #pretty lightweight, install them all: Install_Package -packageName:"teamviewer"; Install_Package -packageName:"mremoteng"; Install_Package -packageName:"terminals.app" -flagName:"terminalsapp"; } function Install_Workstation_DevTools(){ if ($specs.InstallWorkstationTools -eq $false -or $specs.InstallWorkstationDevTools -eq $false){ return; } Install_Workstation_DevBrowsers Install_Workstation_NETDevTools Install_Workstation_FrontEndDevTools } function Install_Workstation_DevBrowsers(){ if ($specs.InstallWorkstationTools -eq $false -or $specs.InstallWorkstationDevTools -eq $false){ return; } Install_Package -packageName:"google-chrome-x64" -flagName:"chrome"; Install_Package -packageName:"firefox"; Install_Package -packageName:"opera"; } function Install_Workstation_NETDevTools(){ if ($specs.InstallWorkstationTools -eq $false -or $specs.InstallWorkstationDevTools -eq $false){ return; } if ($specs.VisualStudioVersion -eq "Ultimate"){ Install_Package "visualstudio2013ultimate" -flagName:"visualstudio"; } if ($specs.VisualStudioVersion -eq "Professional"){ Install_Package "visualstudio2013professional" -flagName:"visualstudio"; } if ($specs.VisualStudioVersion -eq "Community"){ Install_Package "isualstudiocommunity2013" -flagName:"visualstudio"; } #always installs the latest (may force you to update your licensing) Install_Package -packageName:"resharper"; Install_Package -packageName:"resharper-clt.portable" -flagName:"resharpercltportable"; Install_Package -packageName:"nunit"; # the current version is too stale -- commenting out: #Install_Package -packageName:"stylecop"; # local dev mail servers (ie null MTAs) allow dev'ing and testing smtp services: Install_Package -packageName:"papercut"; Install_Package -packageName:"smtp4dev"; # Within Resharper, there's a tool to disassembling and looking at source code # of assemblies on which your apps have dependencies, but for investigating other products/assemblies, # this is more appropriate: Install_Package -packageName:"dotpeek"; #With webdeploy(actually, msdeploy), this is rarely needed now, #but still adding it until MSI's are really really history. Install_Package -packageName:"wixtoolset"; } function Install_Workstation_FrontEndDevTools(){ if ($specs.InstallWorkstationTools -eq $false -or $specs.InstallWorkstationDevTools -eq $false){ return; } Install_Git Install_Package -packageName:"hg"; Install_Package -packageName:"sublimetext3"; if ($specs.TestRun -eq $true){ Write-Host("TestRun: Would Install yo bower and grunt...") } else{ RefreshEnvironmentVariables #$tmp=$env:AppData + "\NPM\" +'npm' $tmp = $env:ProgramFiles + "\NodeJS\NPM" &$tmp update -g npm &$tmp install --global yo bower grunt-cli &yo --version &bower --version &grunt --version } } function Install_Workstation_Misc(){ if ($specs.InstallWorkstationTools -eq $false -or $specs.InstallWorkstationMiscTools -eq $false){ return; } Install_Package -packageName:"vlc"; Install_Package -packageName:"handbrake"; Install_Package -packageName:"shotcut"; } function Install_Server_OpenSourceCITools(){ if ($specs.InstallServerTools -eq $false -or $specs.InstallServerCITools -eq $false){ return; } Install_Package -packageName:"jenkins"; #for ci if vs is not installed Install_Package -packageName:"microsoft-build-tools" -flagName:"microsoftbuildtools"; } function Install_Server_CIServiceAccount(){ if ($specs.InstallServerTools -eq $false -or $specs.InstallServerCITools -eq $false){ return; } if (!$specs.Accounts.CIServiceAccountPassword){ Write-Host "No CI Service Account password provided. Step Skipped." return; } if (!$specs.go){ Write-Host "TestRun: would create account for ${specs.Accounts.CIServiceAccountName} [${specs.Accounts.CIServiceAccountPassword}]" }else { $hostname = $env:Computername; $username = $specs.Accounts.CIServiceAccountName; Ensure-LocalUser -userName:$username -password:$specs.Accounts.CIServiceAccountpassword #Add to a group: net localgroup Administrators $hostname\$username /ADD } } function Ensure-LocalUser(){ [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string] $userName, [Parameter(Mandatory=$true)] [string] $password [Parameter()] [string] $description="" ) process{ $objOu = [ADSI]"WinNT://${env:Computername}" $localUsers = $objOu.Children | where {$_.SchemaClassName -eq 'user'} | % {$_.name[0].ToString()} if($localUsers -NotContains $userName) { $objUser = $objOU.Create("User", $userName) $objUser.setpassword($password) $objUser.SetInfo() $objUser.description = description $objUser.SetInfo() return $true } else { return $false } } } CreateLinuxHOMEEnvironmentVariable InstallChocolatey