質問編集履歴

2

質問時点以降に試したことを追記しました。

2018/11/09 07:47

投稿

tipsy
tipsy

スコア11

test CHANGED
File without changes
test CHANGED
@@ -80,7 +80,7 @@
80
80
 
81
81
 
82
82
 
83
- WebAPI→A.exe呼び出し
83
+ WebAPI→A.exe呼び出し(2018/10/31追記)
84
84
 
85
85
  ```VB
86
86
 
@@ -98,7 +98,7 @@
98
98
 
99
99
  ```
100
100
 
101
- A.exe→B.exe呼び出し
101
+ A.exe→B.exe呼び出し(2018/10/31追記)
102
102
 
103
103
  ```VB
104
104
 
@@ -148,7 +148,7 @@
148
148
 
149
149
 
150
150
 
151
- B.exe内のWebBrowser関連の処理
151
+ B.exe内のWebBrowser関連の処理(2018/10/31追記)
152
152
 
153
153
  ```VB
154
154
 
@@ -216,7 +216,7 @@
216
216
 
217
217
  ```
218
218
 
219
- WebBrowser2クラス
219
+ WebBrowser2クラス(2018/10/31追記)
220
220
 
221
221
  (他の人が作りかけていたものを引き継いで手探りで調べながら作成しためコメントに誤りがあるかもしれません。)
222
222
 
@@ -605,3 +605,41 @@
605
605
  ・本番サーバ:Windows Server 2012 R2(IIS Version 8.5.9600.16384)
606
606
 
607
607
  ・開発環境:Windows 7 Professional(IIS Version 7.5.7600.16385)
608
+
609
+
610
+
611
+ ### 他に試したこと2
612
+
613
+ ・アプリケーションプールの詳細設定でアプリケーションプールのIDを
614
+
615
+  DefaultAppPoolから管理者権限のあるユーザーに変更。(2018/11/09追記)
616
+
617
+ 期待した動作は得られるようになりましたが下記の理由で没に。現在は設定していません。
618
+
619
+ ・アプリケーションプールの権限が強すぎてセキュリティ面に不安がある。
620
+
621
+ ・確認した日によって動作が変わるが、理由が不明。
622
+
623
+  【サーバーメンテナンス前】
624
+
625
+   ・Administartorsグループのユーザーだとクッキー無効時のエラー画面に遷移。
626
+
627
+   ・Administratorがログイン状態でないとクッキー無効時のエラー画面に遷移。
628
+
629
+  【サーバーメンテナンス後】
630
+
631
+   ・Administratorsグループのユーザーでも正常動作。
632
+
633
+   ・ログイン状態でなくても正常動作。
634
+
635
+
636
+
637
+ ・WebBrowserControl.exeのバージョンをIE11に設定。(2018/11/09追記)
638
+
639
+ →クッキー無効時のエラー画面に遷移。
640
+
641
+
642
+
643
+ ・HTTPClientでの実装(2018/11/09追記)
644
+
645
+ クッキーの一部が取得できませんでした。ブラウザでサイトを開いたときの動作をFiddlerで確認したところ、ログインページのソースで指定されている外部スクリプトをGET後、その内部の処理で作成したURLをGETしてCookieの設定を追加しているようでした。作成されるURLは毎回変わります。(用語・表現が正確ではないかもしれません。)JavaScriptはブラウザで実行するもの、という認識のためHTTPClientのみではログイン不可能なサイトだと考えています。

1

それぞれの呼び出し部分のコードとWebBrowserについて追記しました。

2018/11/09 07:47

投稿

tipsy
tipsy

スコア11

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  私自身がWeb系開発の初心者で、
18
18
 
19
- 周囲にもASP.NET Web フォームアプリケーション開発の経験者がいないため
19
+ 周囲にもASP.NET Web フォームアプリケーション開発に詳しい人がいないため
20
20
 
21
21
  初歩的な知識が抜けている可能性があります。
22
22
 
@@ -80,6 +80,454 @@
80
80
 
81
81
 
82
82
 
83
+ WebAPI→A.exe呼び出し
84
+
85
+ ```VB
86
+
87
+ Dim MyProc As Process
88
+
89
+ MyProc = New Process
90
+
91
+ MyProc.EnableRaisingEvents = False
92
+
93
+ MyProc.StartInfo.FileName = "C:\xxxxx\A.exe"
94
+
95
+ MyProc.StartInfo.Arguments = "99999" '引数はユーザーID
96
+
97
+ MyProc.Start()
98
+
99
+ ```
100
+
101
+ A.exe→B.exe呼び出し
102
+
103
+ ```VB
104
+
105
+ Dim procUp As New Process
106
+
107
+ procUp.StartInfo.FileName = "C:\xxxxx\B.exe"
108
+
109
+ '引数はエラーログとサイトでのアップロードに使用するファイルのパス
110
+
111
+ procUp.StartInfo.Arguments = "C:\xxxxx\err.txt" & " " & "C:\xxxxx\upload.csv"
112
+
113
+
114
+
115
+ Try
116
+
117
+ procUp.Start()
118
+
119
+ Catch ex As Exception
120
+
121
+ 'exeの実行で例外が出た場合は即中止
122
+
123
+ MyErrStream = New StreamWriter(wErrFilePath, True, System.Text.Encoding.GetEncoding("Shift-JIS"))
124
+
125
+ MyErrStream.WriteLine("B.exe実行時に例外が発生しました。(" & ex.GetType().ToString & ")")
126
+
127
+ ExeErrFG = True
128
+
129
+ End Try
130
+
131
+
132
+
133
+ If ExeErrFG = False Then
134
+
135
+ procUp.WaitForExit(600000)
136
+
137
+ If procUp.HasExited = False Then
138
+
139
+ procUp.Kill()
140
+
141
+ End If
142
+
143
+ '(省略)
144
+
145
+ End If
146
+
147
+ ```
148
+
149
+
150
+
151
+ B.exe内のWebBrowser関連の処理
152
+
153
+ ```VB
154
+
155
+ Public WithEvents WebBrowser1 As New WebBrowser2()
156
+
157
+ Private pURL As String = "https://xxxxxxx/"
158
+
159
+
160
+
161
+ Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
162
+
163
+
164
+
165
+ '(省略)
166
+
167
+
168
+
169
+ '拡張したWebBrowser2をFormに追加
170
+
171
+ WebBrowser1.Dock = DockStyle.Fill
172
+
173
+ Controls.Add(WebBrowser1)
174
+
175
+ WebBrowser1.ScriptErrorsSuppressed = True
176
+
177
+ WebBrowser1.Navigate(pURL & "login.jsp") 'ログイン画面
178
+
179
+ End Sub
180
+
181
+
182
+
183
+ Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
184
+
185
+ '「試したこと」に記載しているクッキーのチェックを行ったコード
186
+
187
+ 'MyWStream.WriteLine("url:" & WebBrowser1.Document.Url.ToString)
188
+
189
+ 'MyWStream.WriteLine("cookie:" & WebBrowser1.Document.Cookie)
190
+
191
+
192
+
193
+ If Environment.ExitCode = 9 Then
194
+
195
+ Application.Exit()
196
+
197
+ Else
198
+
199
+ If WebBrowser1.Document.Url.ToString.Contains(pURL) Then
200
+
201
+ '画面ごとに必要なhtml要素の有無を確認してから操作していく処理(省略)
202
+
203
+ Else
204
+
205
+ MyWStream.WriteLine("URLが不正です。(" & WebBrowser1.Document.Url.ToString & ")")
206
+
207
+ AppCloseRtn(9)
208
+
209
+ Exit Sub
210
+
211
+ End If
212
+
213
+ End If
214
+
215
+ End Sub
216
+
217
+ ```
218
+
219
+ WebBrowser2クラス
220
+
221
+ (他の人が作りかけていたものを引き継いで手探りで調べながら作成しためコメントに誤りがあるかもしれません。)
222
+
223
+ ```VB
224
+
225
+ Imports System.Runtime.InteropServices
226
+
227
+ Imports System.Security.Permissions
228
+
229
+
230
+
231
+ Public Class WebBrowser2
232
+
233
+ Inherits WebBrowser
234
+
235
+
236
+
237
+ Private cookie As AxHost.ConnectionPointCookie
238
+
239
+ Private helper As WebBrowser2EventHelper
240
+
241
+
242
+
243
+ 'イベントデリゲートの宣言
244
+
245
+ Public Event NavigateError As WebBrowserNavigateErrorEventHandler
246
+
247
+
248
+
249
+ 'デリゲートの宣言
250
+
251
+ Public Delegate Sub WebBrowserNavigateErrorEventHandler(ByVal sender As Object, _
252
+
253
+ ByVal e As WebBrowserNavigateErrorEventArgs)
254
+
255
+
256
+
257
+ <PermissionSetAttribute(SecurityAction.LinkDemand, _
258
+
259
+ Name:="FullTrust")> Protected Overrides Sub CreateSink()
260
+
261
+
262
+
263
+ '派生元クラスのCreateSinkを呼び出す
264
+
265
+ MyBase.CreateSink()
266
+
267
+
268
+
269
+ 'コントロールのイベント処理をActiveXに接続する
270
+
271
+ helper = New WebBrowser2EventHelper(Me)
272
+
273
+ cookie = New AxHost.ConnectionPointCookie( _
274
+
275
+ Me.ActiveXInstance, helper, GetType(DWebBrowserEvents2))
276
+
277
+
278
+
279
+ End Sub
280
+
281
+
282
+
283
+ <PermissionSetAttribute(SecurityAction.LinkDemand, _
284
+
285
+ Name:="FullTrust")> Protected Overrides Sub DetachSink()
286
+
287
+
288
+
289
+ 'ActiveXに接続されているコントロールのイベント処理を解放する
290
+
291
+ If cookie IsNot Nothing Then
292
+
293
+ cookie.Disconnect()
294
+
295
+ cookie = Nothing
296
+
297
+ End If
298
+
299
+
300
+
301
+ '派生元クラスのDetachSinkを呼び出す
302
+
303
+ MyBase.DetachSink()
304
+
305
+
306
+
307
+ End Sub
308
+
309
+
310
+
311
+ 'ActiveXからのナビゲートエラーイベントによるコールバック
312
+
313
+ Protected Overridable Sub OnNavigateError( _
314
+
315
+ ByVal e As WebBrowserNavigateErrorEventArgs)
316
+
317
+
318
+
319
+ RaiseEvent NavigateError(Me, e)
320
+
321
+
322
+
323
+ End Sub
324
+
325
+
326
+
327
+ 'NavigateErrorイベント情報クラス
328
+
329
+ Private Class WebBrowser2EventHelper
330
+
331
+ Inherits StandardOleMarshalObject
332
+
333
+ Implements DWebBrowserEvents2
334
+
335
+
336
+
337
+ Private parent As WebBrowser2
338
+
339
+
340
+
341
+ Public Sub New(ByVal parent As WebBrowser2)
342
+
343
+ Me.parent = parent
344
+
345
+ End Sub
346
+
347
+
348
+
349
+ Public Sub NavigateError(ByVal pDisp As Object, _
350
+
351
+ ByRef URL As Object, ByRef frame As Object, _
352
+
353
+ ByRef statusCode As Object, ByRef cancel As Boolean) _
354
+
355
+ Implements DWebBrowserEvents2.NavigateError
356
+
357
+
358
+
359
+ ' Raise the NavigateError event.
360
+
361
+ Me.parent.OnNavigateError( _
362
+
363
+ New WebBrowserNavigateErrorEventArgs( _
364
+
365
+ CStr(URL), CStr(frame), CInt(statusCode), cancel))
366
+
367
+
368
+
369
+ End Sub
370
+
371
+
372
+
373
+ End Class
374
+
375
+
376
+
377
+ End Class
378
+
379
+
380
+
381
+ 'NavigateErrorイベントのプロパティセット
382
+
383
+ Public Class WebBrowserNavigateErrorEventArgs
384
+
385
+ Inherits EventArgs
386
+
387
+
388
+
389
+ Private urlValue As String
390
+
391
+ Private frameValue As String
392
+
393
+ Private statusCodeValue As Int32
394
+
395
+ Private cancelValue As Boolean
396
+
397
+
398
+
399
+ Public Sub New( _
400
+
401
+ ByVal url As String, ByVal frame As String, _
402
+
403
+ ByVal statusCode As Int32, ByVal cancel As Boolean)
404
+
405
+
406
+
407
+ Me.urlValue = url
408
+
409
+ Me.frameValue = frame
410
+
411
+ Me.statusCodeValue = statusCode
412
+
413
+ Me.cancelValue = cancel
414
+
415
+
416
+
417
+ End Sub
418
+
419
+
420
+
421
+ Public Property Url() As String
422
+
423
+ Get
424
+
425
+ Return urlValue
426
+
427
+ End Get
428
+
429
+ Set(ByVal value As String)
430
+
431
+ urlValue = value
432
+
433
+ End Set
434
+
435
+ End Property
436
+
437
+
438
+
439
+ Public Property Frame() As String
440
+
441
+ Get
442
+
443
+ Return frameValue
444
+
445
+ End Get
446
+
447
+ Set(ByVal value As String)
448
+
449
+ frameValue = value
450
+
451
+ End Set
452
+
453
+ End Property
454
+
455
+
456
+
457
+ Public Property StatusCode() As Int32
458
+
459
+ Get
460
+
461
+ Return statusCodeValue
462
+
463
+ End Get
464
+
465
+ Set(ByVal value As Int32)
466
+
467
+ statusCodeValue = value
468
+
469
+ End Set
470
+
471
+ End Property
472
+
473
+
474
+
475
+ Public Property Cancel() As Boolean
476
+
477
+ Get
478
+
479
+ Return cancelValue
480
+
481
+ End Get
482
+
483
+ Set(ByVal value As Boolean)
484
+
485
+ cancelValue = value
486
+
487
+ End Set
488
+
489
+ End Property
490
+
491
+
492
+
493
+ End Class
494
+
495
+
496
+
497
+ ' NavigateErrorのインターフェース定義
498
+
499
+ <ComImport(), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), _
500
+
501
+ InterfaceType(ComInterfaceType.InterfaceIsIDispatch), _
502
+
503
+ TypeLibType(TypeLibTypeFlags.FHidden)> _
504
+
505
+ Public Interface DWebBrowserEvents2
506
+
507
+
508
+
509
+ <DispId(271)> Sub NavigateError( _
510
+
511
+ <InAttribute(), MarshalAs(UnmanagedType.IDispatch)> _
512
+
513
+ ByVal pDisp As Object, _
514
+
515
+ <InAttribute()> ByRef URL As Object, _
516
+
517
+ <InAttribute()> ByRef frame As Object, _
518
+
519
+ <InAttribute()> ByRef statusCode As Object, _
520
+
521
+ <InAttribute(), OutAttribute()> ByRef cancel As Boolean)
522
+
523
+
524
+
525
+ End Interface
526
+
527
+ ```
528
+
529
+
530
+
83
531
  ### 試したこと
84
532
 
85
533
  エラー画面でクッキーが無効という旨が記載されていたため、