Windows10에서 BASIC 인증 화면에 ID와 비밀번호를 자동 입력하는 소프트웨어를 만들었다
할 수 있는 일
아래와 같은 Window가 나오고 있을 때 본 기사의 프로그램을 실행하면, 지정의 ID와 패스워드를 자동으로 입력합니다.
C# 컴파일
이 근처가 참고가 될까.
htps : // m / 유키 451 / ms / c9c6 A 2b79 96 Ae 0d252
이번 소스에 관해서는 아래와 같이 어셈블리의 경로를 지정한다(환경에 의존할지도).
csc /r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\UIAutomationClient\v4.0_4.0.0.0__31bf3856ad364e35\UIAutomationClient.dll ^
/r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\UIAutomationTypes\v4.0_4.0.0.0__31bf3856ad364e35\UIAutomationTypes.dll ^
/r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\WindowsBase\v4.0_4.0.0.0__31bf3856ad364e35\WindowsBase.dll ^
Test.cs
소스 코드
Test.cs
using System;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
using System.Windows.Automation;
public static class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindowEx(IntPtr hWndParent, IntPtr hWndChildAfter, string lpszClass, string lpszWindow);
public delegate bool EnumWindowsDelegate(IntPtr hWnd, IntPtr lparam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc, IntPtr lparam);
}
public class Class1
{
static AutomationElement FindCredentialWindow()
{
IntPtr hWnd = NativeMethods.FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Credential Dialog Xaml Host", "Windows セキュリティ");
if ( hWnd == IntPtr.Zero ) {
return null;
}
return AutomationElement.FromHandle(hWnd);
}
static string FindTextBlockMatches(AutomationElement aeForm, Regex r)
{
var elems = FindElementsByClassName(aeForm, "TextBlock");
foreach ( AutomationElement elem in elems ) {
var elemInfo = elem.Current;
if ( r.IsMatch(elemInfo.Name) ) {
return elemInfo.Name;
}
}
return null;
}
static void InputToCredentialWindow(AutomationElement aeForm, string userId, string password)
{
AutomationElement aeUserId = FindElementById(aeForm, "EditField_0");
AutomationElement aePassword = FindElementById(aeForm, "PasswordField_1");
AutomationElement aeOkButton = FindElementById(aeForm, "OkButton");
if ( aeUserId != null && aePassword != null && aeOkButton != null ) {
var vpUserId = (ValuePattern)aeUserId.GetCurrentPattern(ValuePattern.Pattern);
var vpPassword = (ValuePattern)aePassword.GetCurrentPattern(ValuePattern.Pattern);
vpUserId.SetValue(userId);
vpPassword.SetValue(password);
// OKも自動で押す場合はこれ
// var ipOkButton = (InvokePattern)aeOkButton.GetCurrentPattern(InvokePattern.Pattern);
// ipOkButton.Invoke();
}
}
static AutomationElement FindElementById(AutomationElement rootElement, string automationId)
{
var cond = new PropertyCondition(AutomationElement.AutomationIdProperty, automationId);
return rootElement.FindFirst(TreeScope.Descendants, cond);
}
static AutomationElementCollection FindElementsByClassName(AutomationElement rootElement, string className)
{
var cond = new PropertyCondition(AutomationElement.ClassNameProperty, className);
return rootElement.FindAll(TreeScope.Descendants, cond);
}
[STAThread]
static void Main()
{
AutomationElement aeForm = FindCredentialWindow();
if ( aeForm != null ) {
// 対象サイト(?)のメッセージに応じて適宜変更. 改行とか合わせるのが面倒なので正規表現で探すようにした
string text = FindTextBlockMatches(aeForm, new Regex("^サーバー(.*)が"));
if ( text != null ) {
Console.WriteLine(text);
// 下記は ID, PASSWORD に応じて適宜変更。機密管理に注意すること。
// やらかし例:ソースにパスワード埋め込んだままGitHubなどでうっかり公開したりとか
InputToCredentialWindow(aeForm, "userid", "password");
}
else {
Console.WriteLine("Not found Credential window with the description.");
}
}
else {
Console.WriteLine("Not found Credential window.");
}
}
}
사전조사
BASIC 인증 화면의 구성 요소를 아래의 도구로 조사했습니다.
htps : // 코 m / 코 b58
참고 사이트
그 후
EditField_0
, PasswordField_1
의 숫자가 다른 인증 화면이 나오는 경우를 만났다.
Windows 사양을 모르겠습니다 ...
또한 그 후 - Edge 대응
이 근처가 참고가 될까.
htps : // m / 유키 451 / ms / c9c6 A 2b79 96 Ae 0d252
이번 소스에 관해서는 아래와 같이 어셈블리의 경로를 지정한다(환경에 의존할지도).
csc /r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\UIAutomationClient\v4.0_4.0.0.0__31bf3856ad364e35\UIAutomationClient.dll ^
/r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\UIAutomationTypes\v4.0_4.0.0.0__31bf3856ad364e35\UIAutomationTypes.dll ^
/r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\WindowsBase\v4.0_4.0.0.0__31bf3856ad364e35\WindowsBase.dll ^
Test.cs
소스 코드
Test.cs
using System;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
using System.Windows.Automation;
public static class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindowEx(IntPtr hWndParent, IntPtr hWndChildAfter, string lpszClass, string lpszWindow);
public delegate bool EnumWindowsDelegate(IntPtr hWnd, IntPtr lparam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc, IntPtr lparam);
}
public class Class1
{
static AutomationElement FindCredentialWindow()
{
IntPtr hWnd = NativeMethods.FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Credential Dialog Xaml Host", "Windows セキュリティ");
if ( hWnd == IntPtr.Zero ) {
return null;
}
return AutomationElement.FromHandle(hWnd);
}
static string FindTextBlockMatches(AutomationElement aeForm, Regex r)
{
var elems = FindElementsByClassName(aeForm, "TextBlock");
foreach ( AutomationElement elem in elems ) {
var elemInfo = elem.Current;
if ( r.IsMatch(elemInfo.Name) ) {
return elemInfo.Name;
}
}
return null;
}
static void InputToCredentialWindow(AutomationElement aeForm, string userId, string password)
{
AutomationElement aeUserId = FindElementById(aeForm, "EditField_0");
AutomationElement aePassword = FindElementById(aeForm, "PasswordField_1");
AutomationElement aeOkButton = FindElementById(aeForm, "OkButton");
if ( aeUserId != null && aePassword != null && aeOkButton != null ) {
var vpUserId = (ValuePattern)aeUserId.GetCurrentPattern(ValuePattern.Pattern);
var vpPassword = (ValuePattern)aePassword.GetCurrentPattern(ValuePattern.Pattern);
vpUserId.SetValue(userId);
vpPassword.SetValue(password);
// OKも自動で押す場合はこれ
// var ipOkButton = (InvokePattern)aeOkButton.GetCurrentPattern(InvokePattern.Pattern);
// ipOkButton.Invoke();
}
}
static AutomationElement FindElementById(AutomationElement rootElement, string automationId)
{
var cond = new PropertyCondition(AutomationElement.AutomationIdProperty, automationId);
return rootElement.FindFirst(TreeScope.Descendants, cond);
}
static AutomationElementCollection FindElementsByClassName(AutomationElement rootElement, string className)
{
var cond = new PropertyCondition(AutomationElement.ClassNameProperty, className);
return rootElement.FindAll(TreeScope.Descendants, cond);
}
[STAThread]
static void Main()
{
AutomationElement aeForm = FindCredentialWindow();
if ( aeForm != null ) {
// 対象サイト(?)のメッセージに応じて適宜変更. 改行とか合わせるのが面倒なので正規表現で探すようにした
string text = FindTextBlockMatches(aeForm, new Regex("^サーバー(.*)が"));
if ( text != null ) {
Console.WriteLine(text);
// 下記は ID, PASSWORD に応じて適宜変更。機密管理に注意すること。
// やらかし例:ソースにパスワード埋め込んだままGitHubなどでうっかり公開したりとか
InputToCredentialWindow(aeForm, "userid", "password");
}
else {
Console.WriteLine("Not found Credential window with the description.");
}
}
else {
Console.WriteLine("Not found Credential window.");
}
}
}
사전조사
BASIC 인증 화면의 구성 요소를 아래의 도구로 조사했습니다.
htps : // 코 m / 코 b58
참고 사이트
그 후
EditField_0
, PasswordField_1
의 숫자가 다른 인증 화면이 나오는 경우를 만났다.
Windows 사양을 모르겠습니다 ...
또한 그 후 - Edge 대응
using System;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
using System.Windows.Automation;
public static class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindowEx(IntPtr hWndParent, IntPtr hWndChildAfter, string lpszClass, string lpszWindow);
public delegate bool EnumWindowsDelegate(IntPtr hWnd, IntPtr lparam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc, IntPtr lparam);
}
public class Class1
{
static AutomationElement FindCredentialWindow()
{
IntPtr hWnd = NativeMethods.FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Credential Dialog Xaml Host", "Windows セキュリティ");
if ( hWnd == IntPtr.Zero ) {
return null;
}
return AutomationElement.FromHandle(hWnd);
}
static string FindTextBlockMatches(AutomationElement aeForm, Regex r)
{
var elems = FindElementsByClassName(aeForm, "TextBlock");
foreach ( AutomationElement elem in elems ) {
var elemInfo = elem.Current;
if ( r.IsMatch(elemInfo.Name) ) {
return elemInfo.Name;
}
}
return null;
}
static void InputToCredentialWindow(AutomationElement aeForm, string userId, string password)
{
AutomationElement aeUserId = FindElementById(aeForm, "EditField_0");
AutomationElement aePassword = FindElementById(aeForm, "PasswordField_1");
AutomationElement aeOkButton = FindElementById(aeForm, "OkButton");
if ( aeUserId != null && aePassword != null && aeOkButton != null ) {
var vpUserId = (ValuePattern)aeUserId.GetCurrentPattern(ValuePattern.Pattern);
var vpPassword = (ValuePattern)aePassword.GetCurrentPattern(ValuePattern.Pattern);
vpUserId.SetValue(userId);
vpPassword.SetValue(password);
// OKも自動で押す場合はこれ
// var ipOkButton = (InvokePattern)aeOkButton.GetCurrentPattern(InvokePattern.Pattern);
// ipOkButton.Invoke();
}
}
static AutomationElement FindElementById(AutomationElement rootElement, string automationId)
{
var cond = new PropertyCondition(AutomationElement.AutomationIdProperty, automationId);
return rootElement.FindFirst(TreeScope.Descendants, cond);
}
static AutomationElementCollection FindElementsByClassName(AutomationElement rootElement, string className)
{
var cond = new PropertyCondition(AutomationElement.ClassNameProperty, className);
return rootElement.FindAll(TreeScope.Descendants, cond);
}
[STAThread]
static void Main()
{
AutomationElement aeForm = FindCredentialWindow();
if ( aeForm != null ) {
// 対象サイト(?)のメッセージに応じて適宜変更. 改行とか合わせるのが面倒なので正規表現で探すようにした
string text = FindTextBlockMatches(aeForm, new Regex("^サーバー(.*)が"));
if ( text != null ) {
Console.WriteLine(text);
// 下記は ID, PASSWORD に応じて適宜変更。機密管理に注意すること。
// やらかし例:ソースにパスワード埋め込んだままGitHubなどでうっかり公開したりとか
InputToCredentialWindow(aeForm, "userid", "password");
}
else {
Console.WriteLine("Not found Credential window with the description.");
}
}
else {
Console.WriteLine("Not found Credential window.");
}
}
}
BASIC 인증 화면의 구성 요소를 아래의 도구로 조사했습니다.
htps : // 코 m / 코 b58
참고 사이트
그 후
EditField_0
, PasswordField_1
의 숫자가 다른 인증 화면이 나오는 경우를 만났다.
Windows 사양을 모르겠습니다 ...
또한 그 후 - Edge 대응
EditField_0
, PasswordField_1
의 숫자가 다른 인증 화면이 나오는 경우를 만났다.Windows 사양을 모르겠습니다 ...
또한 그 후 - Edge 대응
Reference
이 문제에 관하여(Windows10에서 BASIC 인증 화면에 ID와 비밀번호를 자동 입력하는 소프트웨어를 만들었다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kob58im/items/f373df61e9ea0be7befa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)