diff --git a/config/feature.json b/config/feature.json index 10835451f3..137cd9ee81 100644 --- a/config/feature.json +++ b/config/feature.json @@ -313,5 +313,13 @@ "Order": "a083_", "Type": "Button", "ButtonWidth": "300" - } + }, + "WPFWinUtilSSHServer": { + "Content": "Enable OpenSSH Server", + "category": "Remote Access", + "panel": "2", + "Order": "a084_", + "Type": "Button", + "ButtonWidth": "300" + }, } diff --git a/docs/userguide.md b/docs/userguide.md index de80eb1900..47a49473d8 100644 --- a/docs/userguide.md +++ b/docs/userguide.md @@ -142,6 +142,10 @@ Open old-school Windows panels directly from WinUtil. Following Panels are avail * System Properties * User Accounts +### Remote Access + +Enables OpenSSH server on your windows machine. + ## Updates --- diff --git a/functions/private/Invoke-WinUtilSSHServer.ps1 b/functions/private/Invoke-WinUtilSSHServer.ps1 new file mode 100644 index 0000000000..7185af7ed3 --- /dev/null +++ b/functions/private/Invoke-WinUtilSSHServer.ps1 @@ -0,0 +1,81 @@ +function Invoke-WinUtilSSHServer { + <# + .SYNOPSIS + Enables OpenSSH server to remote into your windows device + #> + + # Get the latest version of OpenSSH Server + $FeatureName = Get-WindowsCapability -Online | Where-Object { $_.Name -like "OpenSSH.Server*" } + + # Install the OpenSSH Server feature if not already installed + if ($FeatureName.State -ne "Installed") { + Write-Host "Enabling OpenSSH Server" + Add-WindowsCapability -Online -Name $FeatureName.Name + } + + # Sets up the OpenSSH Server service + Write-Host "Starting the services" + Start-Service -Name sshd + Set-Service -Name sshd -StartupType Automatic + + # Sets up the ssh-agent service + Start-Service 'ssh-agent' + Set-Service -Name 'ssh-agent' -StartupType 'Automatic' + + # Confirm the required services are running + $SSHDaemonService = Get-Service -Name sshd + $SSHAgentService = Get-Service -Name 'ssh-agent' + + if ($SSHDaemonService.Status -eq 'Running') { + Write-Host "OpenSSH Server is running." + } else { + try { + Write-Host "OpenSSH Server is not running. Attempting to restart..." + Restart-Service -Name sshd -Force + Write-Host "OpenSSH Server has been restarted successfully." + } catch { + Write-Host "Failed to restart OpenSSH Server: $_" + } + } + if ($SSHAgentService.Status -eq 'Running') { + Write-Host "ssh-agent is running." + } else { + try { + Write-Host "ssh-agent is not running. Attempting to restart..." + Restart-Service -Name sshd -Force + Write-Host "ssh-agent has been restarted successfully." + } catch { + Write-Host "Failed to restart ssh-agent : $_" + } + } + + #Adding Firewall rule for port 22 + Write-Host "Setting up firewall rules" + $firewallRule = (Get-NetFirewallRule -Name 'sshd').Enabled + if ($firewallRule) { + Write-Host "Firewall rule for OpenSSH Server (sshd) already exists." + } else { + New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 + Write-Host "Firewall rule for OpenSSH Server created and enabled." + } + + # Check for the authorized_keys file + $sshFolderPath = "$env:HOMEDRIVE\$env:HOMEPATH\.ssh" + $authorizedKeysPath = "$sshFolderPath\authorized_keys" + + if (-not (Test-Path -Path $sshFolderPath)) { + Write-Host "Creating ssh directory..." + New-Item -Path $sshFolderPath -ItemType Directory -Force + } + + if (-not (Test-Path -Path $authorizedKeysPath)) { + Write-Host "Creating authorized_keys file..." + New-Item -Path $authorizedKeysPath -ItemType File -Force + Write-Host "authorized_keys file created at $authorizedKeysPath." + } else { + Write-Host "authorized_keys file already exists at $authorizedKeysPath." + } + Write-Host "OpenSSH server was successfully enabled." + Write-Host "The config file can be located at C:\ProgramData\ssh\sshd_config " + Write-Host "Add your public keys to this file -> $authorizedKeysPath" +} diff --git a/functions/public/Invoke-WPFButton.ps1 b/functions/public/Invoke-WPFButton.ps1 index 2773ccb571..ee4d0421d5 100644 --- a/functions/public/Invoke-WPFButton.ps1 +++ b/functions/public/Invoke-WPFButton.ps1 @@ -58,5 +58,6 @@ function Invoke-WPFButton { "WPFCloseButton" {Invoke-WPFCloseButton} "MicrowinScratchDirBT" {Invoke-ScratchDialog} "WPFWinUtilPSProfile" {Invoke-WinUtilpsProfile} + "WPFWinUtilSSHServer" {Invoke-WinUtilSSHServer} } }