我有一个要求,我需要在登录身份验证期间从 RSA 令牌输入安全 ID,然后开始运行自动化测试。
是否可以通过任何 api 或任何其他方式以编程方式访问 RSA 令牌值,以便可以完全自动化测试流程?
我有一个要求,我需要在登录身份验证期间从 RSA 令牌输入安全 ID,然后开始运行自动化测试。
是否可以通过任何 api 或任何其他方式以编程方式访问 RSA 令牌值,以便可以完全自动化测试流程?
我们通过执行以下操作自动登录到使用 rsa 安全 ID 和 Cisco AnyConnect 的 vpn:
1)以您想要的方式以编程方式打开 rsa 安全 ID
2)运行以下.ps1
#Source http://www.lazywinadmin.com/2010/06/powershell-get-clipboard-set-clipboard.html
function Get-ClipBoard {
Add-Type -AssemblyName System.Windows.Forms
$tb = New-Object System.Windows.Forms.TextBox
$tb.Multiline = $true
$tb.Paste()
$tb.Text
}
# end Source http://www.lazywinadmin.com/2010/06/powershell-get-clipboard-set-clipboard.html
$wshell = New-Object -ComObject wscript.shell;
$wshell.AppActivate('the name')#Here you need to write the name that appears on the left top corner of the rsa secure id window
Sleep 1
$wshell.SendKeys('{TAB}')
$wshell.SendKeys('~')
$a = Get-ClipBoard
#Source http://www.cze.cz
#This script is tested with "Cisco AnyConnect Secure Mobility Client version 3.0.5080″
#Please change following variables
[string]$CiscoVPNHost = 'the vpn you are trying to connect'
[string]$Login = 'your user'
[string]$Password = $a
#Please check if file exists on following paths
[string]$vpncliAbsolutePath = 'C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe'
[string]$vpnuiAbsolutePath = 'C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpnui.exe'
#****************************************************************************
#**** Please do not modify code below unless you know what you are doing ****
#****************************************************************************
Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop
#Set foreground window function
#This function is called in VPNConnect
Add-Type @'
using System;
using System.Runtime.InteropServices;
public class Win {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
'@ -ErrorAction Stop
#quickly start VPN
#This function is called later in the code
Function VPNConnect()
{
Start-Process -FilePath $vpncliAbsolutePath -ArgumentList "connect $CiscoVPNHost"
$counter = 0; $h = 0;
while($counter++ -lt 1000 -and $h -eq 0)
{
sleep -m 10
$h = (Get-Process vpncli).MainWindowHandle
}
#if it takes more than 10 seconds then display message
if($h -eq 0){echo "Could not start VPNUI it takes too long."}
else{[void] [Win]::SetForegroundWindow($h)}
}
#Terminate all vpnui processes.
Get-Process | ForEach-Object {if($_.ProcessName.ToLower() -eq "vpnui")
{$Id = $_.Id; Stop-Process $Id; echo "Process vpnui with id: $Id was stopped"}}
#Terminate all vpncli processes.
Get-Process | ForEach-Object {if($_.ProcessName.ToLower() -eq "vpncli")
{$Id = $_.Id; Stop-Process $Id; echo "Process vpncli with id: $Id was stopped"}}
#Disconnect from VPN
echo "Trying to terminate remaining vpn connections"
start-Process -FilePath $vpncliAbsolutePath -ArgumentList 'disconnect' -wait
#Connect to VPN
echo "Connecting to VPN address '$CiscoVPNHost' as user '$Login'."
VPNConnect
#Write login and password
[System.Windows.Forms.SendKeys]::SendWait("$Login{Enter}")
[System.Windows.Forms.SendKeys]::SendWait("$Password{Enter}")
#Start vpnui
start-Process -FilePath $vpnuiAbsolutePath
#Wait for keydown
#echo "Press any key to continue …"
#try{$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")}catch{}
#Exit
您现在需要做的就是在上面的脚本中设置您的 vpn 和用户。
您需要指定使用哪种令牌。
我听说这里有很多选择:
请查看此链接了解更多详情: http ://www.emc.com/security/rsa-securid/rsa-securid-software-authenticators.htm#!offerings_for_web_browsers
使用硬件令牌,您将需要使用某种相机并读取所拍摄图像的像素(我无法帮助您)
软件令牌更简单。
我最近创建了能够执行、输入 PIN 和读取令牌应用程序中生成的密码的小型命令行工具。我无法将工具(我公司的财产)发送给您,但我可以为您提供一些提示,以创建您自己的应用程序来执行相同的操作。
但首先你需要告诉我你是否使用软件令牌。
好的。由于您有软件令牌,我将描述我的应用程序如何自动连接到 VPN。
1)您需要在执行此操作之前配置您的软件令牌。
除此之外,还需要配置 VPN 客户端,并且连接必须列在可用连接列表中。
配置完成后,您可以进行自动 VPN 连接。
我们有类似于这个的软件令牌:
https
://ssl.seagate.com/ssl/docs/soft_token_install_instructions.html
我们的 VPN 客户端看起来像这样:
http://wireless-setup.wsu.edu/msIPSEC。 html
2) 配置完所有工具后,您就可以开始 VPN 连接了。
你需要做好深入调查的准备。
来自 RSA 的人非常努力地工作,以使我们在这里所做的事情变得不可能。
他们不使用普通控件。他们创建了自己的控件,我没有规范。
我已经使用 C++ 和 WIN32 API 函数完成了它。这是我的食谱。
a)读取传递给程序的参数
b)验证参数我有多个参数,如 PIN、要建立的连接数、建立连接时运行的命令等。它们当然可以硬编码,但为了灵活,我可以从命令行传递它们。
c)检查令牌应用程序[EnumWindows]
令牌应用程序可以有 2 个顶级窗口 [您输入 PIN 的一个,一个带有密码的窗口]
如果我检测到两个窗口都打开了,我关闭应用程序并重新启动它。
您可以尝试发送消息WM_CLOSE以关闭应用程序。我模拟用户按下“X”关闭按钮的动作
//restore it <if minimized>
SendMessage(hwndTokenApplicationPinWindow,WM_SYSCOMMAND,SC_RESTORE,NULL);
//close the app
SendMessage(hwndTokenApplicationPinWindow,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(223,14));
SendMessage(hwndTokenApplicationPinWindow, WM_LBUTTONUP,0,MAKELPARAM(223,14));
要启动它,我使用CreateProcess函数。
当您重新启动应用程序或只打开一个窗口时,您现在可以输入 PIN 码。
d)输入密码
我模拟用户左键单击 pin 窗口 WM_LBUTTONDOWN、WM_LBUTTONUP。
我使用 WM_CHAR 输入引脚。
输入后,使用 WM_LBUTTONDOWN、WM_LBUTTONUP 单击确定按钮。
完成后,您应该会显示密码窗口。
e)读取密码
要获取密码,我使用令牌中的复制按钮。此按钮 将数据复制到剪贴板。
我们模拟按下这个按钮: WM_LBUTTONDOWN, WM_LBUTTONUP
并从剪贴板读取数据:
BOOL InvalidData = FALSE;
OpenClipboard(NULL);
HANDLE clip0 = GetClipboardData(CF_UNICODETEXT);
wchar_t* p=(wchar_t*)GlobalLock(clip0);
if(wcslen(p) == MaxPasscodeSize-1)
wcscpy_s(currentPasscode,MaxPasscodeSize,p);
else if(wcslen(p) != MaxPasscodeSize-1 && wcslen(p) != 0)
{
wprintf(L"Error: Passcode in clipboard is invalid\n");
InvalidData = TRUE;
}
GlobalUnlock(clip0);
CloseClipboard();
现在您已准备好在 CISCO VPN 客户端中使用的密码。
请让我知道这对您是否有意义。
如果是这样,并且您的应用程序在这一点上工作,请告诉我,我将通过说明来处理 VPN 客户端。
如果您需要上述步骤的更详细说明,请告诉我。
一个想法是记录一堆时钟/令牌对并为您的程序运行时钟并重播记录。实际上,如果你可以选择煮钟,你真的只需要一对。
(我没有说这是一个好主意。)
祝你好运,/鲍勃·布莱恩