diff --git a/README.md b/README.md index 0afa4d0..dc67ecf 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,18 @@ Tools for managing Windows setting * [`hvswitch`.cmd](https://git.hmp.today/pavel.muhortov/tweaks-for-windows#hvswitch-cmd) * [`rdpusers`.cmd](https://git.hmp.today/pavel.muhortov/tweaks-for-windows#rdpusers-cmd) * [`1cibases`.cmd](https://git.hmp.today/pavel.muhortov/tweaks-for-windows#1cibases-cmd) +* [`dfs-set-active`.ps1](https://git.hmp.today/pavel.muhortov/tweaks-for-windows#dfs-set-active-ps1) ____ ## `hvswitch`.cmd -**Description:** Microsoft Hyper-V switch on/off -**Dependencies:** Windows (tested version 10.0.19043) +**Description:** +> Microsoft Hyper-V switch on/off + +**Dependencies:** +> +> * Windows (tested version 10.0.19043) | POSITION | PARAMETERS | DESCRIPTION | DEFAULT | |-----------|--------------|------------------------|---------------| @@ -29,8 +34,13 @@ ____ ## `rdpusers`.cmd -**Description:** RDS Shadow Connection -**Dependencies:** Windows (tested version 6.3.9600), permission on target hostname (*gpedit.msc -> Computer Configuration -> Policies -> Administrative Templates -> Windows components -> Remote Desktop Services -> Remote Session Host -> Connections -> Set rules for remote control of Remote Desktop Services user sessions: Full Control without users's permission*) +**Description:** +> RDS Shadow Connection + +**Dependencies:** +> +> * Windows (tested version 6.3.9600) +> * permission on target hostname (*gpedit.msc -> Computer Configuration -> Policies -> Administrative Templates -> Windows components -> Remote Desktop Services -> Remote Session Host -> Connections -> Set rules for remote control of Remote Desktop Services user sessions: Full Control without users's permission*) | POSITION | PARAMETERS | DESCRIPTION | DEFAULT | |-----------|--------------|------------------------|---------------| @@ -52,7 +62,7 @@ ____ **Dependencies:** > > * Windows (tested version 6.3.9600) -> * privileged rights for backup +> * privileged rights (only for backup) | POSITION | PARAMETERS | DESCRIPTION | DEFAULT | |-----------|--------------|------------------------|---------------| @@ -67,4 +77,35 @@ ____ 2\. Only if you need to rewrite user changes at their logon: > > * Create `%SYSTEMDRIVE%\Windows\System32\GroupPolicy\User\Scripts\Logon\1cibases.cmd` -> * gpedit.msc -> User Configuration -> Administrative Templates -> System -> Logon -> Run these programs at user logon: %SYSTEMDRIVE%\Windows\System32\GroupPolicy\User\Scripts\Logon\1cibases.cmd qn r +> * gpedit.msc -> User Configuration -> Administrative Templates -> System -> Logon -> Run these programs at user logon: `%SYSTEMDRIVE%\Windows\System32\GroupPolicy\User\Scripts\Logon\1cibases.cmd qn r`. + +____ + +## `dfs-set-active`.ps1 + +**Description:** +> Set active server for used DFS namespaces. + +**Dependencies:** +> +> * Windows (tested versions 6.1.7601, 10.0.19045, 10.0.22621) +> * privileged rights + +| POSITION | PARAMETERS | DESCRIPTION | DEFAULT | +|-----------|--------------|------------------------|---------------| +| 1 | **-child** |internal execute switch | `false` | + +### `dfs-set-active`.ps1 setup + +1\. Create config file. + +```powershell +@" +\\domain.local\dfs_namespace_1\share_dir_1:\\server_1.domain.local\share_dir_1 +\\domain.local\dfs_namespace_2\share_dir_2:\\server_2.domain.local\share_dir_2 +"@ | Out-File $env:\Windows\System32\GroupPolicy\Machine\Scripts\Startup\dfs-set-active.cfg -Encoding "UTF8" +``` + +2\. Create startup script. + +gpedit.msc -> Computer Settings -> Policies -> Windows Settings -> Scripts (Startup/Shutdown) -> Startup -> PowerShell Scripts: `%SYSTEMDRIVE%\Windows\System32\GroupPolicy\Machine\Scripts\Startup\dfs-set-active.ps1`. diff --git a/dfs-set-active.ps1 b/dfs-set-active.ps1 new file mode 100644 index 0000000..f57e13e --- /dev/null +++ b/dfs-set-active.ps1 @@ -0,0 +1,100 @@ +param( + [Parameter(Mandatory=$false,Position=0)][switch]$child +) + + +function Get-PSVersion { + if (Test-Path Variable:PSVersionTable) { + return $PSVersionTable.PSVersion.ToString() + } + else { + return "1.0.0.0" + } +} + +function Test-AdminRights { + $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent()) + return $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) +} + +function Set-DFSActive { + foreach ($line in $(Get-Content -Path $Global:cfg)) { + $dfsLink = $line.Split(':')[0] + $smbPath = $line.Split(':')[1] + Set-Location "Microsoft.PowerShell.Core\FileSystem::$dfsLink" + Start-Process dfsutil.exe -ArgumentList "client","property","state","active","$dfsLink","$smbPath" + } +} + + +$Global:cfg = $MyInvocation.MyCommand.Path.Replace('.ps1', '.cfg') + + +if (!(Test-AdminRights)) { + if (!($child)) { + $params = New-Object System.Collections.ArrayList + foreach ($key in $MyInvocation.BoundParameters.Keys) { + [void]$params.Add("-$key") + [void]$params.Add($PSBoundParameters.$key) + } + Start-Process powershell.exe -Verb RunAs -ArgumentList ( + "-NoProfile -File ""{0}"" -child $($params -join " ")" -f $($MyInvocation.MyCommand.Definition) + ) + exit + } +} +else { + if (!(Test-Path -Path "$env:SystemRoot\System32\dfsutil.exe")) { + try { + $system = $(Get-WmiObject -Class "Win32_OperatingSystem") + # Windows 11, 10, 2022, 2019, 2016, 8.1, 2012R2 + if (($system.Version -like '10.0.*') -or ($system.Version -like '6.3.*')) { + # Workstation + if ($system.ProductType -like '1') { + $capability = "Rsat.FileServices.Tools" + if (!(Get-WindowsCapability -Name "*$capability*" -Online | Where-Object State -eq 'Installed' -ErrorAction Stop)) { + Get-WindowsCapability -Name "*$capability*" -Online | Add-WindowsCapability -Online -ErrorAction Stop + } + } + # DomainController, Server + if (($system.ProductType -like '2') -or ($system.ProductType -like '3')) { + $capability = "RSAT-DFS-Mgmt-Con" + if(!(Get-WindowsFeature -Name "*$capability*" | Where-Object InstallState -eq 'Installed' -ErrorAction Stop)) { + Get-WindowsFeature -Name "*$capability*" | Install-WindowsFeature -IncludeAllSubFeature -ErrorAction Stop + } + } + } + # Windows 7, 2008R2 + if ($system.Version -like '6.1.*') { + # Workstation + if ($system.ProductType -like '1') { + if (!(Get-WmiObject -Class "Win32_QuickFixEngineering" | Where-Object { $_.HotFixID -like '*958830' })) { + if ($system.OSArchitecture -like '32*') { + Start-Process wusa.exe -ArgumentList "\\capital.local\sys\repo\distrib\microsoft\rsat\win7\Windows6.1-KB958830-x86.msu","/quiet","/norestart" -ErrorAction Stop -Wait + } + if ($system.OSArchitecture -like '64*') { + Start-Process wusa.exe -ArgumentList "\\capital.local\sys\repo\distrib\microsoft\rsat\win7\Windows6.1-KB958830-x64.msu","/quiet","/norestart" -ErrorAction Stop -Wait + } + } + Start-Process dism.exe -ArgumentList "/Online","/Enable-Feature:RemoteServerAdministrationTools" -ErrorAction Stop -Wait + Start-Process dism.exe -ArgumentList "/Online","/Enable-Feature:RemoteServerAdministrationTools-Roles" -ErrorAction Stop -Wait + Start-Process dism.exe -ArgumentList "/Online","/Enable-Feature:RemoteServerAdministrationTools-Roles-FileServices" -ErrorAction Stop -Wait + Start-Process dism.exe -ArgumentList "/Online","/Enable-Feature:RemoteServerAdministrationTools-Roles-FileServices-Dfs" -ErrorAction Stop -Wait + } + # DomainController, Server + if (($system.ProductType -like '2') -or ($system.ProductType -like '3')) { + } + } + } + catch [System.Management.Automation.CommandNotFoundException] { + Write-Host "Powershell $(Get-PSVersion) need to update" + Start-Sleep 10 + Exit 1 + } + } + if (!(Test-Path -Path "$($Global:cfg)")) { + Exit 1 + } + Set-DFSActive + Exit 0 +}