PowerShell에서 Windows Credential Manager 액세스
Windows Server 2008 R2에서 PowerShell 2.0(SP2010 때문에 필요)을 사용하고 있습니다.윈도우즈 자격 증명 관리자에서 프로세스에 대한 자격 증명을 검색해야 합니다.저는 그것을 해낼 수 없을 것 같습니다.
나는 다음과 같은 암호를 받았습니다.
[Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime]
(new-object Windows.Security.Credentials.PasswordVault).RetrieveAll() | % { $_.RetrievePassword(); $_ }
두 줄의 코드 스로우 오류
Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime : Unable to find type [Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime]: make sure that the assembly containing this type is loaded.
그리고.
(new-object Windows.Security.Credentials.PasswordVault).RetrieveAll() | % {$_.RetrievePassword(); $_ }
각각 다음과 같다.어떻게든 PasswordVault 클래스를 가져오려고 했습니다.지금까지 구글은 나를 실패시켰고, 나는 구글이 어느 어셈블리에 있는지조차 찾지 못했습니다.제가 무엇을 빠뜨리고 있나요?
in powershell5 type:
Install-Module CredentialManager -force
그리고나서
New-StoredCredential -Target $url -Username $ENV:Username -Pass ....
나중에
Get-StoredCredential -Target ....
모듈의 소스 코드는 https://github.com/davotronic5000/PowerShell_Credential_Manager 입니다.
Credential Manager와 상호 작용하려면 Win32 API에 액세스해야 합니다.
Technet 스크립트 갤러리의 CredMan.ps1이 이를 잘 보여줍니다.
사용자를 나열하거나 새 자격 증명을 추가하는 것과 같은 간단한 사용 패턴을 위해 자격 증명 관리를 위한 내장 Windows 명령줄 유틸리티를 사용할 수도 있습니다.
PowerShell에 저장된 자격 증명을 재사용하기 위해, 이 사람은 시스템을 구축하는 방법을 찾은 것 같습니다.PSCredential
CredMan.ps1: Get-StoredCredential과 유사한 기술을 사용하여 Credential Store의 GenericCredential 핸들에서 생성됩니다.
최종 사용자에게 모듈을 설치하거나 DLL 파일을 포함하도록 지시할 필요 없이 스크립트를 배포할 수 있도록 코드 스니펫만 원하는 사람이 있다면 이 방법이 효과적일 것입니다.
$code = @"
using System.Text;
using System;
using System.Runtime.InteropServices;
namespace CredManager {
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CredentialMem
{
public int flags;
public int type;
public string targetName;
public string comment;
public System.Runtime.InteropServices.ComTypes.FILETIME lastWritten;
public int credentialBlobSize;
public IntPtr credentialBlob;
public int persist;
public int attributeCount;
public IntPtr credAttribute;
public string targetAlias;
public string userName;
}
public class Credential {
public string target;
public string username;
public string password;
public Credential(string target, string username, string password) {
this.target = target;
this.username = username;
this.password = password;
}
}
public class Util
{
[DllImport("advapi32.dll", EntryPoint = "CredReadW", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern bool CredRead(string target, int type, int reservedFlag, out IntPtr credentialPtr);
public static Credential GetUserCredential(string target)
{
CredentialMem credMem;
IntPtr credPtr;
if (CredRead(target, 1, 0, out credPtr))
{
credMem = Marshal.PtrToStructure<CredentialMem>(credPtr);
byte[] passwordBytes = new byte[credMem.credentialBlobSize];
Marshal.Copy(credMem.credentialBlob, passwordBytes, 0, credMem.credentialBlobSize);
Credential cred = new Credential(credMem.targetName, credMem.userName, Encoding.Unicode.GetString(passwordBytes));
return cred;
} else {
throw new Exception("Failed to retrieve credentials");
}
}
[DllImport("Advapi32.dll", SetLastError = true, EntryPoint = "CredWriteW", CharSet = CharSet.Unicode)]
private static extern bool CredWrite([In] ref CredentialMem userCredential, [In] int flags);
public static void SetUserCredential(string target, string userName, string password)
{
CredentialMem userCredential = new CredentialMem();
userCredential.targetName = target;
userCredential.type = 1;
userCredential.userName = userName;
userCredential.attributeCount = 0;
userCredential.persist = 3;
byte[] bpassword = Encoding.Unicode.GetBytes(password);
userCredential.credentialBlobSize = (int)bpassword.Length;
userCredential.credentialBlob = Marshal.StringToCoTaskMemUni(password);
if (!CredWrite(ref userCredential, 0))
{
throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
}
}
}
}
"@
Add-Type -TypeDefinition $code -Language CSharp
# How to store credentials
[CredManager.Util]::SetUserCredential("Application Name", "Username", "Password")
# How to retrieve credentials
[CredManager.Util]::GetUserCredential("Application Name")
# How to just get the password
[CredManager.Util]::GetUserCredential("Application Name").password
위 코드는 PowerShell 7 및 PowerShell 5에서 테스트되었지만, 의 최신 버전이 필요할 수도 있습니다.후자를 사용하는 경우 네트워크 프레임워크.
마이크로소프트 사의 Secret Management와 SecretStore가 공식 솔루션인 것 같습니다.2021년 3월 25일에 공식 출시되었습니다.비밀은 자격 증명이 될 수 있습니다.
Install-Module Microsoft.PowerShell.SecretManagement
Install-Module SecretManagement.JustinGrote.CredMan # windows credential manager
Register-SecretVault SecretManagement.JustinGrote.CredMan
Set-Secret -Name TestSecret -Secret "TestSecret"
Get-Secret -Name TestSecret -AsPlainText
TestSecret
문서에 따르면 Windows Server 2008 R2에서는 PasswordVault 클래스가 지원되지 않습니다.
지원되는 최소 서버 Windows Server 2012
https://msdn.microsoft.com/library/windows/apps/windows.security.credentials.passwordvault.aspx
정말 좋은 게시물을 찾았습니다. 이 코드는 모든 사용자 이름, 리소스 및 암호를 인쇄합니다.
[Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime]
$vault = New-Object Windows.Security.Credentials.PasswordVault
$vault.RetrieveAll() | % { $_.RetrievePassword();$_ }
토드가 올린 글에 대한 공을 인정합니다.
언급URL : https://stackoverflow.com/questions/29103238/accessing-windows-credential-manager-from-powershell
'code' 카테고리의 다른 글
아콘다 루트 환경 재설정 방법 (0) | 2023.10.30 |
---|---|
오류 메시지 없이 PL/SQL 컴파일이 실패함 (0) | 2023.10.30 |
#토큰 없이 식별자 정의 (0) | 2023.10.30 |
팬더 하이퍼링크로 읽기_excel (0) | 2023.10.30 |
C에서 상수를 문장으로 사용할 수 있는 이유는 무엇입니까? (0) | 2023.10.30 |