如何自动化连接采用Azure AAD认证的本地Windows虚拟机并实现文件传输与命令执行?
兄弟,太懂你手动RDP反复输密码的痛苦了!之前用Paramiko搞定Linux那套确实顺手,但Windows加上Azure AD认证后,确实不能直接照搬SSH的路子,我给你捋几个靠谱的自动化方案,都是实际能用的:
方案一:用PowerShell原生实现(最推荐)
Windows和PowerShell天生适配,而且原生支持Azure AD认证,不管你是本地内网加入AAD的VM,还是Azure云上的AAD登录VM,这个方案都能搞定,步骤也清晰:
1. 准备工作
- 确保目标Windows VM已经配置好AAD登录(你手动能RDP进去就没问题)
- 本地机器安装Azure PowerShell模块,没装的话跑这个命令:
Install-Module -Name Az -AllowClobber -Scope CurrentUser
- 目标VM开启WinRM服务(默认应该开了,要是没开,手动RDP进去跑
Enable-PSRemoting -Force)
2. 自动化登录Azure AD(避免手动输密码)
如果要完全自动化,别用手动的Connect-AzAccount,改用服务主体或者证书登录,比如用服务主体的方式:
# 替换成你的租户ID、服务主体ID和密钥 $tenantId = "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx" $clientId = "yyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyy" $clientSecret = ConvertTo-SecureString "你的服务主体密钥" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential($clientId, $clientSecret) # 登录Azure AD Connect-AzAccount -ServicePrincipal -Credential $credential -Tenant $tenantId
3. 建立远程PowerShell会话
先把目标VM加入本地WinRM信任列表,不然会报安全错误:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "目标VM的IP或主机名" -Concatenate -Force
然后用AAD账号建立远程会话,自动化的话可以把密码存在环境变量里,避免硬编码:
$aadUsername = "你的AAD用户名@你的租户域名.com" # 从环境变量读取密码,安全又方便 $password = ConvertTo-SecureString $env:AAD_VM_PASSWORD -AsPlainText -Force $aadCredential = New-Object System.Management.Automation.PSCredential($aadUsername, $password) # 建立远程会话 $remoteSession = New-PSSession -ComputerName "目标VM的IP" -Credential $aadCredential
4. 文件传输
用Copy-Item结合远程会话就能搞定,和本地复制一样简单:
# 本地文件传到VM Copy-Item -Path "C:\本地路径\test.zip" -Destination "D:\VM上的目标路径\" -ToSession $remoteSession # 从VM下载文件到本地 Copy-Item -Path "D:\VM上的路径\output.log" -Destination "C:\本地下载路径\" -FromSession $remoteSession
5. 远程执行命令
用Invoke-Command直接在远程会话里跑命令,想执行啥Windows命令、脚本都可以:
# 比如查看VM里带random的文件 $result = Invoke-Command -Session $remoteSession -ScriptBlock { Get-ChildItem "D:\目标目录\*random*" # 也可以运行批处理、exe,比如安装软件 Start-Process "D:\setup.exe" -Wait -NoNewWindow } # 打印执行结果 Write-Host "远程命令执行结果:" $result
方案二:开启Windows OpenSSH服务,用类似Paramiko的方式
如果你习惯了用Python的SSH库操作,也可以给Windows VM开启OpenSSH服务,然后配置AAD认证,这样就能用Paramiko或者ssh2-python这类库操作了,不过步骤稍多:
1. 在目标VM上开启OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Start-Service sshd Set-Service -Name sshd -StartupType 'Automatic'
2. 配置AAD认证SSH
需要在VM上安装Azure AD SSH登录扩展,或者用PowerShell配置AAD作为SSH的身份源,配置后注意AAD用户登录SSH时的用户名格式是AzureAD\你的AAD用户名或者你的UPN。
3. 用Python连接(类似Paramiko)
配置好之后,就可以用Paramiko尝试连接,示例代码大概是这样:
import paramiko host = "目标VM的IP" username = "你的AAD用户名@租户域名.com" password = "你的AAD密码" client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: client.connect(host, username=username, password=password) # 传输文件 sftp = client.open_sftp() sftp.put("本地文件路径", "VM上的路径") # 执行命令 stdin, stdout, stderr = client.exec_command("dir *random*") print(stdout.read().decode('gbk')) # Windows默认编码是GBK,注意解码 finally: client.close()
不过这个方案要注意,Windows的OpenSSH对AAD认证的支持不如PowerShell原生,可能会遇到权限或者配置问题,所以还是优先推荐方案一。
备注:内容来源于stack exchange,提问作者Anshuman Kumar

