内网的一台服务器上的装机默认用户密码忘记了,但是好在别的电脑上使用RDCMan(Remote Desktop Connection Manager)连接过这台服务器,并且保存了密码。于是经过一番折腾,最后把密码找回来了:
最后成功的powershell脚本来自于这个地址:
https://www.undocumented-features.com/2019/10/03/decrypting-credentials-stored-in-remote-desktop-manager-rdcman-rdg/
但是能找到这个地址是因为这篇文章给出的三个方案,就有powershell,
https://www.cnblogs.com/Thorndike/p/15325079.html
因为不好使,就根据脚本里面的关键字去搜索,才找到的。(百度和bing都没有有效的结果,这次实际上发挥作用的是google)
最终有效的脚本是这个:
# Decrypt passwords in RDG files
param($RDGFile,
$PasswordString,
$RDCManSource
)
If (!$RDCManSource)
{
$RDCManSource = (Get-ChildItem -Path @('C:\Program Files\Microsoft', 'C:\Program Files (x86)\Microsoft') -File "RDCMan.exe" -Recurse -ErrorAction SilentlyContinue)[0]
}
If (!$RDCManSource)
{
Write-Error "Remote Desktop Manager must be installed. If it is installed, use the -RDCManSource parameter to specify the executable's location."
Exit
}
else
{
Write-Host "goto RDCManSource."
Write-Host $RDCManSource.FullName
try
{
$Assembly = [Reflection.Assembly]::LoadFile($RDCManSource)
}
catch
{
$_.Exception.Message.ToString();
Write-Host "Catch"; Exit
}
try { Import-Module $Assembly }
catch
{
$_.Exception.Message.ToString();
Write-Host "Import Exception"; exit }
}
If ($RDGFile)
{
Write-Host "goto RDGFile."
Write-Host
[xml]$Data = Get-Content $RDGFile
$CredentialValues = $Data.SelectNodes("*//logonCredentials")
$global:Output = @()
foreach ($obj in $CredentialValues)
{
try
{
$EncryptionSettings = New-Object -TypeName RdcMan.EncryptionSettings
$Password = [RdcMan.Encryption]::DecryptString($obj.password, $EncryptionSettings)
}
catch
{
$_.Exception.Message.ToString(); continue
}
If ($Password -and ($Password -notcontains 'Failed to decrypt'))
{
$CredObject = New-Object PSObject
$CredObject | Add-Member -Type NoteProperty -Name "ProfileName" -Value $obj.ProfileName -ea SilentlyContinue -Force
$CredObject | Add-Member -Type NoteProperty -Name "UserName" -Value $obj.username -ea SilentlyContinue -Force
$CredObject | Add-Member -Type NoteProperty -Name "Password" -Value $Password
$CredObject | Add-Member -Type NoteProperty -Name "Domain" -Value $obj.domain
$global:Output += $CredObject
}
}
If ($Output)
{
$Output
}
Else
{
Write-Host "Nothing to show."
}
}
else
{
If ($PasswordString)
{
$EncryptionSettings = New-Object -TypeName RdcMan.EncryptionSettings
$Password = [RdcMan.Encryption]::DecryptString($PasswordString, $EncryptionSettings)
Write-Host "Cleartext password: $($Password)"
}
}
需要注意的是,我电脑上使用的是绿色版,所以是传参进来的
.\dops2 -RDGFile '.\本地电脑.rdg' -RDCManSource 'D:\Green\RDCMan\RDCMan.exe'
其它另外一个尝试过的脚本:
Copy-Item 'C:\Program Files (x86)\Microsoft\Remote Desktop Connection Manager\RDCMan.exe' 'C:\windows\temp\RDCMan.dll'
Import-Module 'C:\windows\temp\RDCMan.dll'
$EncryptionSettings=New-Object-TypeName RdcMan.EncryptionSettings
$lines=Get-Content RDCManpass.txt
foreach ($line in $lines){
$PwdString= $line
[RdcMan.Encryption]::DecryptString($PwdString,$EncryptionSettings)
}
windows 10系统直接执行脚本会报错:
解决办法:
https://blog.csdn.net/qq_15585305/article/details/131436046
另外PowerShell脚本传参,参考了这篇:
https://blog.csdn.net/wan_ghuan/article/details/104346908