← 返回文章

Windows 管理

WindowsWindowsPowerShellRDPSSH

管 Windows 伺服器大多離不開 PowerShell,這頁收的是遠端管理的常用操作:開 RDP 帳號與登入紀錄稽核、schtasks 排程工作、PowerShell 環境設定、搜檔案內容、架 OpenSSH server、使用者與權限。指令以 PowerShell 為主,部分段落是 cmd。RDP 那段的登入稽核,在懷疑帳號被試密碼的時候特別有用。

RDP 帳號與監控

開 RDP 帳號

Code
New-LocalUser -Name "account" -Password (ConvertTo-SecureString "<password>" -AsPlainText -Force) -FullName "account"
Set-LocalUser -Name "account" -PasswordNeverExpires $true
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "account"

監控登入紀錄

  1. Win + R → eventvwr.msc → Windows 記錄 → 安全性
  2. 事件 ID:4624 登入成功、4625 登入失敗、4778 RDP 重新連線、4779 RDP 中斷
  3. 詳細資訊看 Account Name、Logon Type、Source Network Address。
  4. Logon Type = 10 為 RDP 登入。
Logon Type說明
2互動式登入(本機)
3網路登入(SMB)
4批次(排程)
5服務登入
10遠端互動式登入(RDP)

排程工作(schtasks)

  • 需與腳本、CI 或遠端維護整合時,比純 GUI 好自動化。

查詢排程(/Query)

Code
schtasks /Query /FO LIST /V

/FO LIST 以清單格式輸出;/V 顯示詳細資訊(下次執行時間、狀態、作者等)。不帶 /FO 時預設為 TABLE。

Code
schtasks /Query /TN "<task_name>"

只查詢名為 TaskName 的單一工作;/TN 指定工作名稱。

Code
schtasks /Query /FO LIST /TN "\<folder>\<task_name>"

查詢放在資料夾底下的工作;路徑以 \ 開頭,例如 \Microsoft\Windows\Backup.

輸出範例(/FO LIST 節錄):

Code
TaskName:     \<task_name>
Next Run Time: <date_time>
Status:       Ready
Author:       <hostname>\<username>
Task To Run:  <script_path>

建立排程(/Create)

Code
schtasks /Create /TN "<task_name>" /TR "<script_path>" /SC DAILY /ST 02:00 /RU SYSTEM

建立每日 02:00 執行的排程;/TR 為要執行的程式或指令,/SC DAILY 為每日,/ST 開始時間,/RU 執行身分(SYSTEM 或 網域\使用者)。

Code
schtasks /Create /TN "<task_name>" /TR "notepad.exe" /SC ONLOGON /RU "%USERNAME%"

/SC ONLOGON 為使用者登入時觸發;/RU %USERNAME% 以目前使用者身分執行。

Code
schtasks /Create /TN "<task_name>" /TR "<script_path>" /SC ONCE /ST 23:00 /SD <date>

/SC ONCE 只執行一次;/SD 為開始日期(YYYY/MM/DD)。

常用 /SCMINUTEHOURLYDAILYWEEKLYMONTHLYONCEONSTARTONLOGONONIDLE

修改排程(/Change)

Code
schtasks /Change /TN "<task_name>" /ENABLE

啟用已停用的排程;/DISABLE 則停用。

Code
schtasks /Change /TN "<task_name>" /RU "<domain>\<user>" /RP "<password>"

修改執行身分與密碼;若改為系統帳號可 /RU SYSTEM,不需 /RP

執行排程(/Run)

Code
schtasks /Run /TN "<task_name>"

立即執行指定排程一次;不影響原有排程時間。

結束工作(/End)

Code
schtasks /End /TN "<task_name>"

強制結束該排程目前正在執行的執行個體;若工作未在跑則無效。

刪除排程(/Delete)

Code
schtasks /Delete /TN "<task_name>" /F

刪除名為 <task_name> 的排程;/F 不提示確認。

Code
schtasks /Delete /TN "\<folder>\<task_name>" /F

刪除資料夾底下的工作;路徑需與建立或查詢時一致。

匯出/匯入(搭配 XML)

工作排程器可匯出工作為 XML,再於命令列匯入:

Code
schtasks /Create /TN "<task_name>" /XML "<xml_path>" /F

/F 覆蓋同名工作;XML 內已含觸發條件與動作,不需再給 /TR/SC

速查

用途參數說明
查詢/Query列出或查單一工作
建立/Create/TN/TR/SC
修改/Change啟用/停用、改帳號
立即執行/Run觸發一次
結束/End結束執行中個體
刪除/Delete常加 /F 免確認

執行 schtasks /? 可看完整參數;需管理員權限時請以管理員身分開啟 CMD 或 PowerShell。

PowerShell 環境

語法檢查

Code
Get-Command -Syntax "<script_path>"

查看 PowerShell 版本

Code
$PSVersionTable

查看核心數

Code
Get-WmiObject -Class Win32_Processor | Select-Object Name, NumberOfCores, NumberOfLogicalProcessors
項目說明
NumberOfCores實體核心數
NumberOfLogicalProcessors邏輯處理器數(含 Hyper-Threading)

服務與 Port

Code
Get-Service | Where-Object { $_.Name -like "*<keyword>*" }
Restart-Service "<service_name>"
Get-Service | Where-Object { $_.Name -like "*<keyword>*" }
Restart-Service "<service_name>" -Force
tasklist /fi "PID eq <pid>"

Port

Code
Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, @{Name="ProcessName";Expression={(Get-Process -Id $_.OwningProcess).Name}}
netstat -ano | Where-Object { $_ -match "LISTENING" }
netstat -an | Select-String ":<port>"

Windows Server 規範:資料夾與 PowerShell 命名

  • 資料夾:空格可、有意義名稱、加日期或版本號。Applications 放應用程式,再一層資料夾包住(如 app_path)。
  • 腳本:PascalCase、Verb-Noun.ps1、核准動詞(Get-DiskInfo、Start-Backup)。

參數規範(PascalCase)

Code
param(
    [string]$ComputerName,
    [string]$LogPath,
    [int]$MaxRetryCount
)

執行對話方塊 (Win + R)

  • 系統:msconfig、sysdm.cpl、control、appwiz.cpl、desk.cpl、intl.cpl、timedate.cpl
  • 網路:ncpa.cpl、firewall.cpl、inetcpl.cpl
  • 工具:cmd、powershell、regedit、msinfo32、dxdiag、eventvwr、devmgmt.msc、diskmgmt.msc、services.msc
  • 資料夾:explorer、%appdata%、%temp%、%userprofile%、%systemroot%
  • 實用:calc、notepad、mspaint、osk、magnify、charmap

配置環境變數

Code
set PATH=%PATH%;<path>
setx /M PATH "%PATH%;<path>"
echo %PATH%
  • set:僅當前視窗、暫時、不需管理員。
  • setx /M:永久、需重新開視窗、需管理員。

刪除環境變數

透過 GUI:Win + R → sysdm.cpl → 進階 → 環境變數 → 系統變數 Path → 編輯 → 刪除該項。

查看核心數(CMD)

Code
wmic cpu get NumberOfCores,NumberOfLogicalProcessors

搜尋檔案內容

用字串找檔案

Code
Get-ChildItem -Recurse -File |
  Select-String "<search_string>"

限定檔案類型

Code
Get-ChildItem -Recurse -File -Filter *.html |
  Select-String "<search_string>"

OpenSSH 伺服器

  1. 建立 user
  2. C:\ProgramData\ssh\sshd_configPasswordAuthentication yes,底下加:
Code
AllowUsers <username>

Match User <username>
PasswordAuthentication yes
  1. 重開 ssh
Code
Restart-Service sshd
  1. 測試
Code
ssh <username>@<host> -p <port>

使用者與權限

LocalUser

Code
Get-LocalUser
Get-LocalGroup
New-LocalUser "<username>" -Password (ConvertTo-SecureString "<password>" -AsPlainText -Force) -FullName "<FullName>" -Description "<Description>"
Set-LocalUser -Name "<username>" -PasswordNeverExpires $true
Add-LocalGroupMember -Group "<groupname>" -Member "<username>"
Get-LocalUser -Name "<username>" | Select-Object *
Remove-LocalUser -Name "<username>"
Remove-Item -Path "C:\Users\<username>" -Recurse -Force
Set-LocalUser -Name "<username>" -Password (ConvertTo-SecureString "<new_password>" -AsPlainText -Force)

群組與權限(net / icacls)

Code
net localgroup <groupname> <username> /add
net localgroup "Remote Desktop Users" <username> /add
icacls "<path>"
icacls "<path>" /inheritance:r
icacls "<path>" /grant "BUILTIN\Administrators:(OI)(CI)(F)"
icacls "<path>" /remove <username>

取得擁有權與刪除資料夾

Code
takeown /f "C:\Users\<username>\.ssh" /r /d y
takeown /f "C:\Users\<username>" /r /d y
icacls "C:\Users\<username>" /grant administrators:F /t
Remove-Item -Path "C:\Users\<username>" -Recurse -Force

RDP 帳號範例

Code
New-LocalUser -Name "<rdp_username>" -Password (ConvertTo-SecureString "<password>" -AsPlainText -Force) -FullName "<rdp_username>"
Set-LocalUser -Name "<rdp_username>" -PasswordNeverExpires $true
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "<rdp_username>"