[.NET] ASP.NETでローカルにファイルを自動保存して開かせたい!?

新年早々書くような内容の話ではないが、ちょっと調べたので載せておきます。
今更書くような内容ではないんですけど、、久々のニッチな.NETネタです。。。
今更、ActiveX!?と思われるでしょうが、実はワシのページの中で「ActiveXがインストールされない謎を追え!!」は、
未だにアクセスが絶えません。何かしら皆さんお困りのようです。
今回はそれとは直接関係ありませんが、多少有益な情報も含まれています。
ま、実際自分がやってみて困ったからともいいますが・・・ってことで、はじまり。
タイトルを見ていただければわかると思いますが、何をやりたいのかは
あまり伝わらないかもしれません。やりたいことは、Webアプリケーションで
サーバサイドで生成したファイルをクライアントのローカルフォルダに保存するという話。
ちなみに、自動保存はとダイアログも表示せずに保存処理を行うことをさしています。
何でそんなことせにゃならんの?と思うことでしょう。
私もそう思います・・・。
まぁ、こういうことをどうしてもやりたいというお客様もいらっしゃるということで、
こういうことを実現することがワシらの仕事でもあるので仕方がないことかと。
ブラウザを介するWebアプリケーションはセキュリティ上、ローカルリソースへの
アクセスは出来ないようになっています(これが出来ちゃうと何でもできてしまうので)。
ま、これが出来てしまうのはいわゆるブラウザのセキュリティホールということになります。
(最近ではGoogle ChromeがNative Clientを導入するとかいう話がありましたが、
あれってどうなったんですかね?)
この壁をぶち破るためには、Microsoftの悪しき資産(今となっては)であるActiveXを利用することになります。
まぁ、前からActiveXを使えば出来ると何となく知ってはいましたが、
実際に試したことがなかったので本当にできるのか?という好奇心もあり調べてみました。
(ま、今更ですけどね・・・)
[ゴール]


サーバで生成したファイルをローカルにこっそり保存する。
さらに追加で、保存後にサーバ上の特定のファイルを開く。
[前提]


  • 既存のWebアプリはC#のASP.NET
  • .NET Frameworkのバージョンは2.0
  • ActiveXを使う
  • 保存するファイルはActiveReportで作成したExcelファイル

[実現方式]


元々はサーバ上でExcelファイルを生成してダウンロードダイアログを表示させていましたが、
一旦サーバ上のTemp領域に保存し、そのファイルをActiveXにてユーザのローカルに保存します。
とその前に、ここに至るまでに他に考えた手段について以下に簡単に書いておきます。
[案①:ActiveXオブジェクトの「FileSyetemObject」を使ってどうにかできないか?]
JavaScriptでFileSystemObjectをCreateObjectで生成して、FileCopyメソッドで
できれば簡単に出来るのではないか!?とまず考えました。
しかし、FileSystemObjectは現状のIEではセキュリティが厳しくなり、デフォルトでは
使えなくなっています。使えるようにするためにはレジストリを変更する必要があり、
セキュリティ上かなり問題があるため、あきらめました。
下記のKBにあるレジストリを削除すれば使えるようにすることは出来ると思います。
(すみません。試してません。)

[案②:.NETのWindowsフォーム コントロール ライブラリではどうだ?]
ActiveXもどきと言われる(?)Windowsフォーム コントロール ライブラリで
簡単にできるんじゃないか?と思い調べてみました。
前提条件として当然ではありますが、クライアントに.NET Frameworkが
インストールされている必要があります。
ボタンを1つだけ配置しているようなコントロールを作成し、クリックイベントで
System.IO.File.Copyでファイルをコピーするようなものを作成し、ビルド。
AutoSaveCtrl.dll(適当につけた名前)をASP.NETのアプリをホストするディレクトリの
ルートにコピーし、Default.aspxファイル(とりあえず)に下記のタグを貼り付ける。

<object id=”AutoSaveCtrl” classid=”http:AutoSaveCtrl.dll#AutoSaveCtrl.UserControl1″ height=”500″ width=”500″ VIEWASTEXT />

そったら、実際にアクセスしてみます。
ActiveX_2_1
色々とコントロールが張り付いていますが(汗)、赤で囲ったところがWindowsフォーム
コントロール ライブラリです。で、ボタンクリック・・・すると。
ActiveX_2_2
何か怒られました、セキュリティを緩めてあげないといけないようです。。。
で、どの設定を変えればいいのか?、まだわかっていません。。。
顧客環境では.NET Frameworkを適用するのが難しい可能性があるため、
これ以上はココでは調べないことに。。。
★参考情報

[案③:VB6でActiveXを作る]
本題です。本当はC++で作らないと現状はまずいのですが、、ワシのスキルが足りないため
とりあえず動作確認ということでVB6で作りました。。。
Visual Studio 2008でC++で作ろうとして立ち往生していたのですが、VB6だとアリエナイぐらい
簡単に作れてしまった。。。VB様さまです。もうサポート切れてるけど。。
やってることは、結局FileSystemObjectでCopyFileして、Shell関数でExcelを起動する
だけなんですけどね・・・orz
作成したActiveXをASP.NETで動作するようにしてあげます。
VB6でコンポーネントの発行を行うと、確認用のhtmファイルが生成されます。
こいつの中身をみると以下のObjectタグがあります。こいつをコピーして、
ASP.NETのDefault.aspxに貼り付けてやります。

<OBJECT ID=”usrCtrl”
CLASSID=”CLSID:9679F117-6628-45D9-8D38-7AFEE5DB39F4″
CODEBASE=”AutoSaveAX.CAB#version=1,0,0,0″>
</OBJECT>

このActiveXのメソッドを呼び出すJavaScriptは以下のものです。
ボタンのクリックイベントのメソッドを呼び出しているだけです。

<script type=”text/javascript”>
function loadExcel(){
document.getElementById(“usrCtrl”).Command1_Click();
}
</script>

以上で案③により開発環境で意図する動作をするところまでは確認できました。
次に実際の顧客環境に展開する際に必要となるパッケージ化の作業を行います。
[パッケージ化]


作成したActiveXを配布するためのパッケージ化を行います。
以下の流れで作業を行います。

  1. Cabファイル作成
  2. デジタル証明書の作成
  3. デジタル署名

①Cabファイル作成
Microsoft Visual Studio 6.0ツールのディストリビューション ウィザードを使って作成します。

  1. 起動したらプロジェクトファイルを選択し、「パッケージ」ボタンをクリック
  2. 「ディストリビューション ウィザード – パッケージスクリプト」でパッケージを選択(無ければ適当な名前をつけて作成)し、「次へ」をクリック
  3. 「ディストリビューション ウィザード – パッケージの形式」で「インターネット パッケージ」を選択し、「次へ」をクリック
  4. 「ディストリビューション ウィザード – パッケージフォルダ」でフォルダを指定し「次へ」をクリック
  5. 「ディストリビューション ウィザード – 含まれるファイル」で、そのまま「次へ」をクリック
  6. 「ディストリビューション ウィザード – ファイルソース」で、そのまま「次へ」をクリック
  7. 「ディストリビューション ウィザード – 安全性設定」で「スクリプト化の安全性保持」および「初期化の安全性保持」を「はい」に変更し、「次へ」をクリック
  8. 「ディストリビューション ウィザード – 完了!」でスクリプト名を設定し、「完了」をクリック

②オレオレ デジタル証明書の作成
正式にはVeriSignあたりで正式な証明書を取得してください。
ここでは動作確認なのでテスト用のオレオレ証明書を作ります。
調査中
(ここはありものの「コード署名」するためのテスト用の証明書をもらいました。。)
作成した証明書をデジタル署名するPCにインストールし、「信頼されたルート証明書機関」に
等されていることを確認してください。
③デジタル署名
.NET Framework SDK等に入っている「signtool.exe」で署名します。
「-t」オプションでオレオレ証明書を指定しています。

signtool sign /f test.pfx /t http://timestamp.verisign.com/scripts/timstamp.dll AutoSaveAX.CAB

実行すると以下のメッセージが表示され、署名完了です。

Done Adding Additional Store
Successfully signed and timestamped: AutoSaveAX.CAB

作成したCabファイルをASP.NETの仮想フォルダに配置して準備完了です。
[ActiveXのインストール]


開発機以外でちゃんと動くかどうか確認します。
しかーし!!
いざ、インストールしてもなぜかインストールされず。
画面を更新するたびに「インストールしますか?」と聞かれるし・・・
何度繰り返しても同じ。。。
途方にくれていると・・・
C:Documents and SettingsXXXXLocal SettingsTemporary Internet Files
に何やらファイル(下記のファイル名)が出力されており。見てみると何やらエラーが出力されているではないですか!

?CodeDownloadErrorLog!name={9679F117-6628-45D9-8D38-7AFEE5DB39F4}

尚、IEのキャッシュは削除しておかないと、このファイルを見つけるのが大変なので、
事前にキャッシュをクリアしておくことをお勧めします。
実際にActiveXがインストールできない場合にも同様にエラーが出ている可能性もありますので、
うまくインストールされない場合には要チェックです。

*** Code Download Log entry (06 Jan 2010 @ 20:07:55) ***
Code Download Error: (hr = 800c0300) Unknown Error!!
Operation failed. Detailed Information:
CodeBase: http://192.168.0.7/AutoSave/AutoSaveAX.CAB
CLSID: {9679F117-6628-45D9-8D38-7AFEE5DB39F4}
Extension:
Type:
LOG: Item AutoSaveAX.ocx being processed.
— Detailed Error Log Follows —
LOG: Download OnStopBinding called (hrStatus = 0 / hrResponseHdr = 0).
LOG: Item AutoSaveAX.ocx being processed.
LOG: Item scrrun.dll being processed.
ERR: INF Processing: Failed (800c0300) processing: scrrun.dll
. Cannot get primary/default language!LOG: URL Download Complete: hrStatus:0, hrOSB:800c0300, hrResponseHdr:0, URL:(http://192.168.0.7/AutoSave/AutoSaveAX.CAB)
LOG: Reporting Code Download Completion: (hr:800c0300 (FAILED), CLASSID: 9679f117…, szCODE:(http://192.168.0.7/AutoSave/AutoSaveAX.CAB), MainType:(null), MainExt:(null))

出力されているエラーコード「800c0300」あたりでググっていくと・・・ありました。
実行時エラー:429 ActiveXコンポーネントはオブジェクトを作成できません。 – 教えて!goo
どうも「scrrun.dll」が古すぎているために、インストール時にエラーとなっているようです。
実際、Cabファイルを生成するのにはVisual Studio 6.0のディストリビューション ウィザードを
使っているため、そのせいかもしれません。
そこで、scrrnjp.dllおよびscrrun.dllあたりを削除して再度Cabファイルを作り直して、
再度インストール!!
ん・・・いつもより長いこと何かやってる!
きたー!!やっとインストールできました。。。
「でも、今更ActiveX」と思うと、現実に引き戻されます。。
[まとめ]
WEBアプリからクライアントのローカルにファイルを保存したい場合は、AjaxとかFlash(Flexとか)なんかを
駆使してもセキュリティ上できませんが、ActiveXを利用すれば確かに出来ます。
しかしながら、IEでしか利用できないことや今後のことを考えると、基本的には
「セキュリティ上、ローカルへのファイル保存は出来ません!」とお断りするべきだと思います。
[参考情報]
あまり精査してませんが、調査中に見たとおぼしきサイト達。

問題認識能力?

えーっと、愚痴っぽい内容なのでそれでも良ければみてくんさいw
3月から参戦している現プロジェクトが何故?こんな酷い有様なってしまったのか??を
個人的に分析している。そんな中、今日ふと思ったことがあったのでここに綴ってみる。
今日、とある仕様に関する問題が発生した。
それに対して対応するのは当たり前として、それが発生した原因。
そして、今後同様の問題発生しないようにするために手を打つのは
個人的には当たり前のことだと思っていた。
が、しかしである。
「問題が潜在していないかを確認することが必要ではないか?」と
PMに話したのだが、どうにもこうにも食いつきが悪い。
ワシにしてみれば、「何でほっとけんの?」という類の話なのだが、
必要だから指示を出すどころか、必要かどうかも判断しようとしない。
これに対して痺れを切らしたワシは、「自分が調べます」と言った。
そんなことをに憤りを感じながら帰宅中。ふと思った。
「PMは問題だという認識が無いじゃなかろうか?」と。
まぁ、何も問題が潜在していないのであれば取り越し苦労ということで済む。
でもまぁ、経験則上、そんなことはない。
自分で言うのもなんだが、ワシは根が心配症なところもあり
よく気が付きたくないような問題に気づいてしまう。
それもあってか、今回のようなケースでギャップを感じるわけです。
というか、PMでこの問題を認識する能力が足りないのは、致命的だとも思う。
そして、このことに気がついて今までの事象が何となく繋がりはじめた。
現在のPMは予想できる問題が発生しても、上からの指示があるまで行動しない傾向がある。
ワシからお願いしてもやってくれないが、同じことを上から言われると動く。
まぁ、これもやりきれないことの一つですな。
(ま、自分が仮にPMだったら、もっとどやされているのでしょうが・・・、
ここは下から目線でということでお許しください。。。)
ココでもう一つの疑問。
自分で判断しないで、上からの指示でしか行動しないのは何でだろう?
ワシの会社はいわゆるグループ企業で、ワシの会社がトップではなく、更に上がいる。
元々はその上からの仕事だけをやっていた。これを内販と呼んでいる。
しかし、それだけでは更なる飛躍はできないため、自社がプライムをはるような
仕事もやるようになった。これを外販と呼んでいる。
ちなみにワシの所属する部署は外販部隊。現在のプロジェクトも外販である。
ココからは想像だが、現状のPMは今まで内販のプロジェクトしか
やってなかったんじゃなかろうか?と。
個人的に内販の仕事はやったことがないので偏見も入っているかもしれないが、
内販は基本的に言われたことをきっちりこなせばいいというイメージ。
つまり、問題が起きそうなことがあったとしても、言われない限りやる必要はない。
なので、先手先手で物事を進めて行く必要があまりないというか、
気にしないでいいような感じなのだろうか。そう考えると、問題に気が付き、認識し、
対応するということが身につかないような気もする。
前のプロジェクトでも似たような性質のPMだったのですが、その方は
内販しか経験していない人だった。経験が無いから、どちらかと言えば
かわいそうな人なんだと頭で認識していても、どうにもこうにも腹が立ったw
そして、よくよく周りを見回してみると、現状のPMと同じ課というか部には
「言われたことだけやればいい」という思考回路の人が多いことに気が付く。
実際のところそれでプロジェクトが回ればいいんだけど、自分の経験上はNoだ。
自分の体が弱ったときに病気になったりするように、問題というものは
「あそこ不安だなぁ」というところで発生する。凄く当り前のことなんだけども。
でもまぁ、不安な部分に気がつかないと結局手の打ちようがないという
「鶏が先か、卵が先か」という話になってしまうのだけれど、気がついている
不安要素は愚直に潰していくしかない。
さて、直接PMに言ったところで何も変わらないということがわかったので、
どういう手段を取るべきか。ちょいと相談してみますかいね。

仕事ノデキナイヤツ

らくがき
えぇ、ワシのことですw
最近、ワシの会社でも例に漏れず!景気の煽りを受けているわけでして、
変動費を抑えるために業務を効率化しろとかなり強く言われている。
まぁ、簡単に言えば残業をするなと言うことですわ。
そんな状況においてワシはというと、相変わらず残業が減らないわけです。
つまりは仕事の出来ない負け組ってやつですわ(´▽`*)
実際、「残業するな!」と言われ始めてから、他の連中は
定時になればそそくさと帰っていく。
ワシにしてみれば「マジで?・・・(゚Д゚;)」という感じ。
あいつらはそんなに仕事を効率的にこなしているのだろうか・・・
ま、ワシの会社には「裁量労働制(サービス残業制度?)」ってのがありまして、
いくら残業したところで給料は増えないんですけど。
じゃぁ、平日は遅くまで仕事をして、土日もどっちか出てまで
仕事すんだよ?って話ですよ。
なので、そこまでして多少なりとも頑張れる自分を分析してみた。
まず、ワシは金のためには仕事はしていない。
「この資格を取れば10万貰える。」と言われても、
必要性を感じないから頑張る気が起きないのです。
じゃぁ、会社のためか?
そんなわけない。
顧客のためか?
ちょっとはそう思う節はあるが、それは大義名分に過ぎない気がする。
じゃぁ、何ナンダ??
今のプロジェクトでも、以前のプロジェクトでも、
ワシはそのプロジェクトを成功させるために投入された。
(と思っている。もしかしたら、思わされている、、のかもしれない)
じゃぁ、ワシにとってその成功とは何だった?
利益とかそういうことは正直考えてなかった。
ただ、目の前に立ち塞がる数々の技術的な問題を解決することに注力していた。
そして、それは今でも変わらない。いいか悪いかはわからん。
ITも物作ることの積み重ねである。動くものを作らないといけない。
顧客が納得いくものでなければ、それはただのゴミだ。
自分にとって問題(トラブル)を解決していくことは、正直好きだw
そのためだったら、頑張れる。
トラブル環境にここ数年身を置いていたせいか、臭いものに気がついてしまう。
自分でも嫌になってしまうぐらい、気がついてしまう。
そして、ほっとけない。
これって、予定されていた業務じゃないから、仕事量が増える。
つまり、残業することになる。って寸法だ(;´Д`)
今現在の結論としては
ワシは成功させるために自己啓発(残業?)しとるんじゃっ!
勝手にやらせてもらいますわ。
ってとこでしょうか。

OutlookのPSFファイル → Maildir形式

絶好調(?)Zimbra中なわけですが。
メールデータの移行で不正なメールが必要ってなもんで、
自宅PCのOutlookで受信しているメールで迷惑メールフォルダに
入っているSPAMを利用しようと考えました。
本来であれば実際のデータを使えればいいのでしょうけど、商用データを入手することは出来ません。
まぁ、当然といえば当然ですけど。
で、簡単にできるだろうと思っていたんですが、結構めんどい。
かなりどうでもいい話なので、適当に読み飛ばしてくださいw
流れとしては以下のようになります。

  1. PSTファイルをOutlookでインポート
  2. Outlook ExpressでOutlookよりメールデータをインポート
  3. OE2 — OutlookExpress-ToにてOutlook Expressのメールデータをmbox形式に変換。
  4. mbox2maildirを使用してmbox形式のデータをMaildir形式に変換

それぞれの処理について説明を少しだけ。
[1:PSTファイルをOutlookでインポート]
わざわざ家でExportしたのにまたインポートするはめになるとは。。
やり方は以下のページでご確認ください。
ファイルをインポートする – Outlook – Microsoft Office Online
[2:Outlook ExpressでOutlookよりメールデータをインポート]
Windows XPなのでOutlook Express 6でインポート。

  1. メニューの[ファイル]-[インポート]-[メッセージ]でインポートウィザードを起動
  2. Microsoft Outlookを選択し、次へをクリック
  3. プロファイルを選択し、次へをクリック
  4. インポートしたいフォルダを選択し、次へをクリック

以上でOutlookからOutlook Expressへのインポートが完了。
[3:OE2 — OutlookExpress-ToにてOutlook Expressのメールデータをmbox形式に変換。]
そういえば、このツールはOutlookからBeckyに移行するときにもお世話になったことを思い出しました。。
コレをダウンロードして解凍し、中にある「OE2.exe」を起動します。
変換元、変換形式(「UNIX mbox」を選択)、変換先を指定し、変換開始をクリック。
これでmbox形式のファイルが出来上がり。
[4:mbox2maildirを使用してmbox形式のデータをMaildir形式に変換]
このPerlのスクリプトをダウンロード。

mbox2maildir <mbox形式のファイル> <出力先フォルダ>

でMaildir形式のファイルの出来上がり。
話がそれるが、メールのヘッダーでToやFromといったものは必須ではありません。
なんで、たまにメーラーで宛先や送信先が空のメールが来ることがあるが、
あれはそういうこと。Toヘッダーがなくてもメールは送れる。
ま、そんなこともワシは知らんかったんだけどね (´ヘ`;)

プロジェクトの行く末

ども。まりおです。
ゴールデンウィークはとりあえずカレンダー通りには休ませてもらってます。
3月の中から毒饅頭プロジェクトに見事に参画してもう2ヶ月近くがたとうとしています。現在のプロジェクトの相手はZimbra。えぇ、Yahoo!が買収したグループウェアです。
設計部署に配属になってから、早4年近く。今のプロジェクトで4つ目です。ほんと、常に挑戦の連続でした。技術的にも自分がもっている能力を活かせることはほとんどなく、いつも知らないことばかりで、常に不安を抱えていました。ま、自分は追い込まれないと力を発揮できないのはわかっているから、ちょうどいいのかもしれないですけど (゚Д゚;)
そして、今回もそうです。常に相手のレベルは上がってきていましたが、今回の相手はマジでヤバイ(ユーザ数、1000万弱)。ほんとに自分がダメになっちまうかもなって思ってしまうほど。
だから、今回は目標を明確にしようと思う。
「全員、生還」
前のプロジェクトでは先輩を含め、2人がダメになってしまった。
そして、この目標は凄腕のPMであるワシの課長が以前のプロジェクトで掲げた目標の一つでもある。
今度こそはそんなことは起こしたくない。ただそれだけ。
なので、また暫くここの書くことは無いかもしれません。
ま、誰も見てないでしょうけどw
とりあえず、生きてますってことで♪
最後に最近の写真をいつものようにコラージュでヽ(´ー`)ノ
2009GWあたり

[.NET] WindowsMobile上のC#アプリのメモリリークを解決せよ!

先週、思いっきりハマッた話です。
そもそも、自分が直接かかわっていないプロジェクトでいきなり日曜に呼び出されて、うんぬんかんぬん・・・ま、そいういった愚痴は置いといてw
このプロジェクトではあるWindowsMobile端末を使用しており、その上で動作する.NET(言語はC#)のアプリケーションにてメモリリークが発生しており、運用上使い物にならないレベルということだった。問題はあるフォームを「ShowDialog()」で開いて閉じてを繰り返すだけで、50KBずつリークするということはわかっていた。
何も確認せずにとりあえず、試してみてもらったのは以下の2つ。

  • メンバ変数でDataSetを使用しているようであれば、必ずDispos()すること。
  • フォームを閉じる際に、フォーム上のコントロールを全て明示的にDispose()すること。

しかし、上記の対応では効果が無かった(結果からすると、いい線をいっていたんだけど足りなかった・・・)。
“[.NET] WindowsMobile上のC#アプリのメモリリークを解決せよ!” の続きを読む

どくまんじゅう

なんと3日連続で投稿!数年前のペースに比べればまだまだでしょうが、
これでもかなりハイペース!!
ある時期、三鷹某所に常駐していたときだろうか、その常駐先ではインターネットに接続することができなかったので、ほんとにネットもテレビも何も見ていなかったのも手伝って、ここに書くこともなくなってしまっていた。
一旦離れてしまうと、いざ書こうと思っても、なんだか自分というアイデンティティがよくわからなくなり、文体(口調といったいいのか)が不自然になり、表現することが億劫になってしまっていた。それが最近ようやくなんとか自分らしさを取り戻し、こうやってまた書くようになった。
まぁ、切っ掛けは「ブログは履歴書だ」というLifeHackerあたりの記事を読んでからだけれども(´▽`*)アハハ
そんな話はどうでもよくて。タイトルの「毒饅頭」について。
世の中「うまい話にはわけがある」なんてことはよく聞きますが、まぁそんな意味あいです。
今日(正確には昨日)、仕事をしていたら本部長(通称:オヤジ)がにじり寄ってきた・・・
最近あまり話すことがなかったから、何かよからぬことがあると察知 (゚Д゚;)
ナニカイヤナヨカンガスル・・・
現状のワシの状況をまずか聞いてきたので、とりあえず伝える。
そして、とある顧客で仕事がとれちゃって、対応する人間を探しているというではないですか。
しかし、その仕事ってのが、技術的にはあるオープンソースの製品のカスタマイズ、顧客はあまりいい話は聞かない会社(色々とやらせてもらってはいるが)、んでもって期間も短い・・・
どれもこれもリスクじゃないですか!!!
世の中、不況といいますが、このようにハイリスク・ノーリターンな仕事ならそれなりにあるようです。。。
そんな仕事をワシの周りでは「どくまんじゅう」と呼んでいる次第であります。
よくよく考えると、ワシが設計にきてから現在3つ目のプロジェクトなんだけど、どれもこれも毒だった気がする。しかも、その毒はどんどん強くなってるような気がしてならない。
とりあえず、「心に止めといて」と言ってオヤジは去っていった。。。
ちょっと前につけたコメントで「4月から無職だ」と書いたけど、今日になってこんな話が舞い込んできたことを考えると不思議でもあり、ありがたい話ではある。「どくまんじゅう」でも食えるだけマシなのかもしれない(ほんとにマシかどうかわかったもんじゃないけど)。しかしながら、オヤジのどこからともなく錬金術のごとく仕事を探してくる手腕には、恐れ入るばかりである。

[Salesforce.com] 時間帯によりログイン制限をしたい。

[要望]
諸事情(内容が内容なので書けませんが・・・)により深夜時間帯(ココでは「3:00~5:00」としておきましょう)にユーザがログインできないように設定したい。
[問題]
標準機能にてログインする時間帯を制御することはできるのですが、以下のような設定しかできません。

  • 曜日を指定して、許可する開始時間と終了時間を指定。
  • 曜日に対して1つのみ

えぇ、曜日に対して1つ。しかも許可する時間帯しか指定できないので「3:00~5:00」となると・・・
なんと!設定できない!!バンザーイ (゚Д゚;)
ほんとねぇ。こんなんばっかでねぇ。やーねー。。
“[Salesforce.com] 時間帯によりログイン制限をしたい。” の続きを読む

[Salesforce.com] FlexでSandboxに対して接続してDebugするには?

さっき恥ずかしながら、一人ではまっており解決したので情報を共有しておこうと思います。。。
まず、SFDCに対してFlexで接続するためには以下のページを参考にしてください。

んでもって、わかりやすいように上記のページのコードをそのまま引用させていただきます。。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:salesforce="com.salesforce.*"
layout="absolute"
applicationComplete="login()" >
<mx:Script>
<![CDATA[
import com.salesforce.*;
import com.salesforce.events.*;
import com.salesforce.objects.*;
import com.salesforce.results.*;

private function login():void {
var lr:LoginRequest = new LoginRequest({
server_url : Application.application.parameters.server_url,
session_id : Application.application.parameters.session_id,
// username : 'admin@demo.com', // <-- put your username here when connecting from local app
// password : 'mypassword1234', // <-- put your password here when connection from local app
callback : new AsyncResponder(sayHello)
});
conn.login(lr);
}

private function sayHello(result:Object):void {
conn.getUserInfo(new AsyncResponder(function(userInfo:Object):void {
message.text = "こんにちは、" + userInfo.userFullName;
}));
}
]]>
</mx:Script>

<salesforce:Connection id="conn" />

<mx:Label id="message" x="10" y="10" fontSize="32" color="#FFFFFF" text=""/>
</mx:Application>

このままの状態でloginメソッドの「username」と「password」にSandboxのアカウントに置き換えてデバッグ実行するとログインに失敗します。
じゃぁ、どうすんの?というと「」とありますが、こいつを以下のように書き換えてください。

<salesforce:Connection id=”conn” serverUrl=”https://test.salesforce.com/services/Soap/u/14.0″ />

これでSandboxに対して接続できるようになります。ま、当たり前なんでしょうけど。
ちょっとはまったんで・・・ね(;´Д`)

[Salesforce.com] オブジェクトの入力規則をApexコードの処理では無視したい。

直近でどうしようか悩んでいた話。
正直、こういうことをやる必要があるお客さんはいないと思いますけど・・・。
やりたいことは以下ののようなこと。
[要望]
取引先のレコードで特定の項目が設定されていた場合、システム管理者以外のユーザが当該レコードを更新しようとすると更新できなくするという入力規則が設定されています。しかし、別の画面(VisualForce)にて取引先のデータを更新する場合には、ユーザのアクセス権およびプロファイルに関係なく取引先レコードを更新させたい。
“[Salesforce.com] オブジェクトの入力規則をApexコードの処理では無視したい。” の続きを読む