プロジェクトの基本的な概念は、SharePoint にアクセスし、特定のファイルが存在することを確認し、そのファイルが別のユーザーによってロックされていないことを確認し、これら 2 つの条件が満たされている場合、Excel がファイルを開いて何らかの処理を行うことです。ファイルを保存し、再度閉じます。
問題は、プログラムが SharePoint にアクセスし、検証手順を実行する時点にあります。当初、私の最初のクラックは SOAP を使用して VBA から直接取得したものでした。Microsoft が SharePoint を 2010 年から 2013 年にダウングレードすることを決定するまで、それは非常にうまく機能していました。つまり、今では Visual Studio と C# を使用して、 SOAPはSP2010でやっていました。
ここにあるコードを実装しようとしました: http://www.vrdmn.com/2013/01/authenticating-net-client-object-model.htmlですが、動作させることができません。私がどうにかして機能させたのは、ブラウザー ウィンドウをポップアップし、有効な Cookie をチェックし、見つかった場合は Cookie を読み取り、そうでない場合はユーザーに SharePoint へのログインを促し、ブラウザーを閉じて続行する 2010 認証モデルでした。の上。
public CookieCollection Show()
{
if (string.IsNullOrEmpty(this.LoginPageUrl)) throw new ApplicationException(Constants.MSG_NOT_CLAIM_SITE);
// navigate to the login page url.
this.webBrowser.Navigate(this.LoginPageUrl);
DisplayLoginForm = new Form();
DisplayLoginForm.SuspendLayout();
// size the login form
int dialogWidth = Constants.DEFAULT_POP_UP_WIDTH;
int dialogHeight = Constants.DEFAULT_POP_UP_HEIGHT;
if (PopUpHeight != 0 && PopUpWidth != 0)
{
dialogWidth = Convert.ToInt32(PopUpWidth);
dialogHeight = Convert.ToInt32(PopUpHeight);
}
DisplayLoginForm.Width = dialogWidth;
DisplayLoginForm.Height = dialogHeight;
DisplayLoginForm.Text = this.fldTargetSiteUrl;
DisplayLoginForm.Controls.Add(this.webBrowser);
DisplayLoginForm.ResumeLayout(false);
//DisplayLoginForm.Show();
Application.Run(DisplayLoginForm);
// see ClaimsWebBrowser_Navigated event
//DisplayLoginForm.Dispose();
return this.fldCookies;
}
この問題は Application.Run(DisplayLoginForm) で発生します。コードを 1 行ずつ実行すると、すべて正常に動作し、VBA コード内で必要な結果が得られます。ただし、F5 キーを使用してプログラムを実行すると (デバッグ モードまたはリリース モードでビルドすることにより)、Application.Run(DisplayLoginForm) は、Cookie jar (私の用語であり、おそらくコンピューター用語ではありません) は、有効な Cookie について検査されています。
コードでわかるように、DisplayLoginForm.Show(); を使用しようとしました。Application.Run ではなく、検索しようとしているファイルへの null 参照を取得し続けたため、そのアプローチも機能しません。
だからここに質問があります:
Web ブラウザー (明らかに Windows フォームとして設定されています) をポップアップ表示し、Cookie を探し、必要に応じてユーザーにプロンプトを表示し、Web ブラウザーを閉じて、適切な値 (ファイル.が存在し、file.islockedbyuser.email であり、どちらも VBA によって呼び出される関数内にあり、どちらも正常に動作します) を Excel に送信し、その過程で Excel をシャットダウンせずにプログラムを終了しますか?