著作一覧 |
検索しても具体的で簡便な方法が見つからない。相談サイトみたいなところに質問はあったが、答えるやつが想像力が欠如したバカらしくなんでそんな必要があるのか、とか説教垂れたりしているし。
時々失敗するが、以下の方法でできた。
ただ、微妙なところもある(後述)。
まず、Windows Script Hostを参照設定する。
const int FACILITY_WIN32 = 7 << 16; const int ERROR_SESSION_CREDENTIAL_CONFLICT = 1219; …… IWshRuntimeLibrary.WshNetwork wshn = new IWshRuntimeLibrary.WshNetwork(); try { wshn.MapNetworkDrive("", "\\\\FileServer\\path", false, "user", "password"); } catch (System.Runtime.InteropServices.COMException e) { if ((e.ErrorCode & 0xfffffff) != (FACILITY_WIN32 | ERROR_SESSION_CREDENTIAL_CONFLICT)) { .... return; } wshn.RemoveNetworkDrive("\\\\FileServer\\path", true, false); wshn.MapNetworkDrive("", "\\\\FileServer\\path", false, "user", "password"); }
ERROR_SESSION_CREDENTIAL_CONFLICTが返るのは、同じドライブを別のログインユーザがマップしている時だと思うのだが、一度だけその例外がスローされたので、試しにRemove/Mapし直すようにしてみたが、おそらくデッドコード。
ドライブ名は割り当てない。アクセスするときはUNCを使う(ドライブ名を固定アサインすると、コンフリクトする可能性があると思う)
IISで動かしたときに、ERROR_NO_SUCH_LOGON_SESSION(1312)となる場合がある。2度目以降。
最初は、利用後は、RemoveNetworkDriveを呼んでいたのだが、それを避けるために、Removeはやめた。ドライブ名は割り当てていないし、他のユーザでFileServerにログインすることもないので、重複例外(ERROR_LOGON_SESSION_COLLISION 1366)だけを気にすれば良いかな、と。
と、うろ覚えのエラーコードなので、実際に試したほうが良い。良くわからないのは、ERROR_NO_SUCH_LOGON_SESSIONが出ることで(このコードは間違いない)、一度は成功して、Removeした2度目にそうなる理屈がわからない。
ジェズイットを見習え |