開発環境:Visual Studio 2017
使用OS:Windows 7
機器の管理画面(HTTPS)にアクセスし、ログインしてそのページ内にある.wriファイルをダウンロードするプログラムの作成を行っています。
仕様
・機器はローカルでの接続で自己証明書である為、セキュリティ警告が必ず出てしまいます。
(エラー内容:このWebサイトのセキュリティ証明書には問題があります )
・ログイン時のページはframeが使用されていてメインページにはID・PASSを入力するソースはありません。
考えた方法
①Webbrowserコントールを使用してログインまで行い、Cookieを取得してHttpWebRequest等に継承してファイルをダウンロード
②Webbrowserコントールを使用してログインまで行い、そのままダウンロード
問題点
・①も②も自己証明書の為、セキュリティ警告がポップアップで表示されること。
・WebbrowserコントロールからHttpWebRequestやWebClient等にCookieを継承する方法についてが調べても理解が不十分な点
現状
・現状は、sendkeyで"Y"を入力するように記述し対応していますが、プログラムとしておかしいと思うので別の方法を知りたい。
・継承方法については分からず、現状はCookieの取得まで出来ている状況。
取得したCookieは下記です。
(temp=temp; SessId=********************; PageSeed=*******************; )
質問内容
証明書エラーを突破してログインをして、ダウンロードまでする方法を教えていただきたいです。よろしくお願いいたします。
機器の管理画面ソース メインページ
<frame src="auth1.html" name="authFrm" id="authFrm" scrolling="no">
機器の管理画面ソース auth1.html
<div id="admin_reauth_text" style="visibility:hidden;"> 管理を始めるためにパスワードを入力してください: </div> <div id="username_line"> <div class="fieldName"> ユーザ名: </div> <div class="fieldValue"> <input type="text" id="userName" name="userName" value="" maxlength="128" autocomplete="off" style="width: 180px;"> </div> </div> <div class="vgap8"></div> <div id="password_line"> <div class="fieldName"> パスワード: </div> <div class="fieldValue"> <input type="password" name="pwd" value="" maxlength="63" autocomplete="off" style="width: 180px;"> </div> </div> <div class="vgap8"></div> <div id="language_line"> <div class="fieldName"> 言語: </div> <div class="fieldValue"> <select name="select2"> <option>日本語</option> </select> </div> </div> <div class="vgap15"></div> <div id="button_line"> <div class="fieldName"> </div> <div class="fieldValue"> <input type="submit" name="Submit" value="ログイン" class="button" > </div>
現状の自身のソースコード
namespace webbrowser { public partial class Form1 : Form { private const string strRegPath = @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION"; private Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(strRegPath, true); private string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe"; private CookieContainer cc; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { regKey.SetValue(strProcessName, 11001, Microsoft.Win32.RegistryValueKind.DWord); webBrowser1.ScriptErrorsSuppressed = false; webBrowser1.Visible = true; webBrowser1.Navigate("機器のURL");//機器にアクセス System.Threading.Thread.Sleep(2000);//2秒待つ SendKeys.Send("Y");//「Y」を押す(セキュリティエラーの苦肉の回避策) while (webBrowser1.IsBusy || webBrowser1.ReadyState != WebBrowserReadyState.Complete) { //無処理 System.Windows.Forms.Application.DoEvents(); System.Threading.Thread.Sleep(100); }//開くまで待つ HtmlWindow iframe = webBrowser1.Document.Window.Frames[0]; HtmlElementCollection elements = iframe.Document.All; HtmlElement id = elements.GetElementsByName("userName")[0]; HtmlElement pw = elements.GetElementsByName("pwd")[0]; id.InnerText = "ID";//ログインIDを入力 pw.InnerText = "password";//ログインPASSを入力 HtmlElement login = elements.GetElementsByName("Submit")[0]; login.InvokeMember("click");//ログインボタンを押す while (webBrowser1.IsBusy || webBrowser1.ReadyState != WebBrowserReadyState.Complete) { System.Windows.Forms.Application.DoEvents(); System.Threading.Thread.Sleep(100); }//開くまで待つ System.Threading.Thread.Sleep(2000);//2秒待つ CookieContainer cc = new CookieContainer(); cc.SetCookies(webBrowser1.Url, webBrowser1.Document.Cookie.Replace(";", ",")); HttpWebRequest req = (HttpWebRequest)WebRequest.Create("ダウンロード先URL");//Cookieをセットしてダウンロード先にアクセス req.CookieContainer = cc; /*下記でエラーが出る。 System.Net.WebException: '接続が切断されました: SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした。 内部例外 AuthenticationException: 検証プロシージャによると、リモート証明書は無効です。 上記で停まってしまい、証明書をスルーするコードを記入すると何も取得出来なくなります。 */ HttpWebResponse res = (HttpWebResponse)req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st); HttpWebResponse res = (HttpWebResponse)req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st); String htmlSorce = sr.ReadToEnd(); Console.WriteLine(htmlSorce); sr.Close(); st.Close(); } }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/08/30 00:14