ラベル Office Addin の投稿を表示しています。 すべての投稿を表示
ラベル Office Addin の投稿を表示しています。 すべての投稿を表示

2023年3月28日火曜日

PowerShell で Mark of The Web 属性を付加するとエラーになる?

Mark of The Web

Mark of The Web (略して MoTW)は Windows のファイル拡張属性で、インターネットからダウンロードされたファイルに特別なしるしを付けて警告を促せるようにするものです。
メールソフト用のプラグインを作っていますので、この属性を使用するのは至極当然のことで。
というわけで、弊社の製品にも実装しました。

問題に遭遇

例によって、いろいろな問題に遭遇したのですが、特に顕著な問題について、ここで報告しておきます。
C:\Temp フォルダに2つのテキストファイルを置きます。(中身はなんでもいいです)
ファイル名は Test_(1.txt, Test_(2.txt です。

まず、PowerShell を起動して(*0)、以下を実行してみます。

PS C:\Temp> Set-Content -Path "C:\Temp\test_(1.txt" -Stream Zone.Identifier -Encoding oem -NoNewline -Value "[ZoneTransfer]`r`nZoneId=3"

エクスプローラで、プロパティを参照すると、セキュリティ属性が付加されているのがわかります。

プログラムから呼び出してみる

次に、対象ファイルを Test_(2.txt に変えて、同じ動作をするプログラムを実装して、実行してみます。
使用したのは VisualStudio 2022, .NET 4.8 ターゲットの C# コンソールアプリケーションです。
using 行を端折ってますが、デフォルトのものでかまいません。

namespace MoTW
{
    class Program
    {

        static void Main(string[] args)
        {
            string file2 = @"C:\Temp\test_(2.txt";
            setMoTW_byPowerShell(file2);
            Console.ReadLine();
        }

        // set MoTW by PowerShell
        private static bool setMoTW_byPowerShell(string filename)
        {
            bool rc = false;
            string arg_format = "Set-Content -Path \"{0}\" -Stream Zone.Identifier -Encoding oem -NoNewline -Value \"[ZoneTransfer]`r`nZoneId=3\"";
            try
            {
                var psinfo = new ProcessStartInfo();
                psinfo.FileName = "powershell.exe";
                psinfo.UseShellExecute = true;
                psinfo.Arguments = string.Format(arg_format, filename);
                psinfo.CreateNoWindow = true;
                psinfo.WindowStyle = ProcessWindowStyle.Hidden;
                Process proc = Process.Start(psinfo);
                proc.WaitForExit();
                rc = (proc.ExitCode == 0);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                rc = false;
            }
            return rc;
        }
    }
}

Power Shell、普段使わないので、改行の指定方法が '`r`n' だということも今回調べましたよw
で、結果。エクスプローラで Test_(2.txt のプロパティを見るとですね。
MoTW 付いていないんですね、これが。
実際に作ったのは、アドインソフトウェアなので DLL ファイルなんですが、同じように MoTW 付いてくれなくて、本当に困ってしまいました。
ちなみに、ファイル名が Test1.txt, Test2.txt であれば、PowerShell も C# プログラムも正常に MoTW が付加されます。

つまり、'(' の文字が含まれていると、実行プログラムからの呼び出しではうまくいかないんですよ。

メールソフト用のアドインでは

1.添付ファイルをディスク上に保存する。
2.ShellExecuteEx を使って(*1)、保存したファイルを開く。
という動作を実装しているので、MoTW 属性のついていないファイルがそのまま開かれたり実行されてしまうんですね。
ZIP書庫を展開したファイルが実行ファイルだった場合、無条件に実行されてしまうことになってしまいます。
危険な状態です。
とても MoTW 対応です!とは言えませんねw

まとめ

結局、各種記号のいくつかが含まれるファイル名では失敗することがわかったので

1.ファイル名を Base64Url エンコードした名前に変更する。
2.PowerShell で Set-Content する(上記のコード)。
3.ファイル名を Base64Url デコードする。
という、本来やらなくてもいいような処理を実装することで問題を回避できました。
めでたしめでたし。(*2)

*0

MoTW を付加する方法には、「デバイスパス指定子」を使って FileStream を操作し Zone識別ファイルを作成する方法もあります。
わんくま同盟の掲示板で魔界の仮面弁士さんに教えていただきました。
この方法は、.NET 4.6.2 以上でうまくいくのですが、Outlook 用のアドインを .NET 4.6.2 以上で構築してもDLL内では .NET4.6.2以前の場合と同じようにエラーとなってしまうため、利用を断念しました。
Outlook がなにかやらかしてるのだと思います。

*1

保存したファイルを開く処理で、System.Diagnostics.Process を使って Start() すると、MoTW を無視して実行してしまいます。
んで、MoTW 属性も消されてしまいます。
しかたなく WIN32API の ShellExecuteEx で Mask 値を SEE_MASK_NOZONECHECKS がセットされないようにして呼び出すようにしました。

*2

「めでたしめでたし」じゃないんですよ。
多くのウィルスソフトやマルウェアなどがメールを介して感染しています。
弊社のプログラムはこれで問題を解決できましたが、同様の処理を実装しているメール用アドインなんかでは致命的です。

とっても致命的な問題だと思ったので、マイクロソフトに報告しておきました。

2020年5月8日金曜日

メールがなくなった?そんなことが起こらないようにするには

受信したはずのメールがなくなった!
というのは、割とよくある話で、実際に何度も相談を受けたことがあります。

そういった相談をされてこられる方には以下の特徴があります。

1.受信したメールは、すべて、Outlookの受信トレイにある。
2.メールの添付ファイルはデスクトップに保存している。

すごいんですよ。
会話中に、
『えーっと、どれだったかな』
と言いながら Outlook のメール検索機能で差出人を検索して
『あーこれこれ』
って膨大なメールから探し出して示してくれるんだけど、元々見ていたメールが見えなくなっちゃうとか。

デスクトップにびっしりとアイコンが並んでいて、短縮されている長いファイル名のファイルを探し出してクリックするところとかを見て
『なんとかしてあげたい』
と思うことしきりです。(笑)

話を元に戻しましょう。
『メールがどこかへ行ってしまった』
ですね。

メールソフトの不具合というのもたしかに考えられます。
多くの場合は忘れていた振分けの指定や、マウスの操作でよそのフォルダに移動してしまった場合が多いものです。
そういった時は、メールソフトの検索機能で送信者や、わずかに覚えているメールの文面を検索して見つけることができます。

こういったシーンのきっかけになるのは、たとえば取引先から
『この間のメールの件、まだ返信をもらってないんだけど』
なんて連絡が来てからあわてるものですから、なかなか効率よく目的のメールを見つけられないことが多いものです。

はじめっからメールを整理しておけば、そういった問題を発生させにくくすることはできるものです。

いざという時に慌てなくて済むように、普段からメールの【仕分け】機能あるいは【振り分け機能】を利用しましょう。


まずは、メールソフトでアカウントの配下に、取引先などわかりやすい名前のフォルダを作成します。

Outlookの「仕分けルール」を使って、
・取引先からのメール(差出人が取引先になっているメール)を受信したら指定フォルダに移動する。
・取引先へのメール(宛先が取引先のメールアドレス)を送信したときは、指定フォルダに移動する。
という2つの指定をしておくことで、その後は取引先とのやり取りを1つのフォルダで管理できるようになります。



















強力な Outlook用の振り分けマネージャ BizFilter for Outlook には「クロスフィルタ」の機能が備わっていて、2つの条件を1度に設定してしまうことができます。




この図では、[取引先¥新選組]のフォルダに、ドメインが「shinsengumi.seasoft.co.jp」の相手とのメールを振り分けるように指示していますが、この1回の設定で
1.shinsengumi.seasoft.co.jpからの受信メールは[取引先¥新選組]フォルダに振り分ける。
2.shinsengumi.seasoft.co.jpへの送信メールは[取引先¥新選組]フォルダに振り分ける。

という2つの振り分け条件を一度に設定できるわけです。

【振り分けマネージャ BizFilter for Outlook】には、ほかにも
・Outlook の仕分け機能では指定できない、AND/ORの複合条件での振り分け
・正規表現を用いた振り分けルールの設定
・設定したルールを再度実行する「イールドフィルタ」
など、メールを中心とした業務の効率を大幅に向上できる数々の機能が備わっています。

1か月無料で試用できるトライアルライセンスを一度試してみてはいかがでしょう?
こちらから無料でダウンロードできますよ。

2018年5月15日火曜日

Time Adapter for Excel のカスタムUI 実行時エラー

突如、Excel 2016 を起動するたびにこんなエラーメッセージが出るようになってしまいました。


どうしたものかと試した結果、こんな感じでうまくいきました。

「ファイル」-「オプション」-「アドイン」を開いて、一番下のコンボボックスで「COMアドイン」を選択して「設定」を押します。

Time Adapter for Excel なるアドインとやらのチェックをすべてオフにしてあげました。


これでうまくいきました。
そもそも何のためのアドインなのか、とかいうのは気にせずに切り捨ててしまいました(笑

2017年12月21日木曜日

先ほどのメールの添付ファイルのパスワードは***

メールの添付ファイルは、暗号化して添付すること。
暗号化パスワードは別メールで送付すること。

といったルールで運用されている企業が多いのはご存知のことと思います。
特に電器系のメーカーさんとかは全社でルール化されているようです。

主な理由は『メールが漏えいした場合に、重要なファイルの内容が漏えいすることを防ぐ』というものなのでしょう。
もし、メールが漏えいしているのであれば、別メールで送られたパスワード通知メールも当然漏えいしているわけですから、添付ファイルを暗号化してそのパスワードを別メールで送るなんてナンセンス極まりない。
送信時の手順もめんどくさいし、メールを受け取られた受信者側にもパスワードを入力してファイルを展開させる必要があるので、めんどくさいし失礼ではないか!
という御意見はもっともだと思います。
https://seasoft.co.jp/products/BizAttacher.html
たしかにご指摘の点についてはもっともではあります。
でも、この面倒な手順が事故を未然に防ぐことに一役買っていることも否定できません。

メールの送信事故というのは毎日のように発生しています。
・ファイルを添付するのを忘れて送信してしまった。
・複数の宛先あてのメールを Bcc ではなく To で送ってしまった。
・個人情報を含んだファイルを第三者に送ってしまった。
・見積書のファイルを別のライバル社に送ってしまった。
などなど。
メールを操作している方ならば、心当たりが少なからずあるはずです。

ファイルの暗号化は「メールが漏えいした場合の対策」だけではなく、メールの利用者がこういった人為的なミスを犯した場合にできるだけ事故の被害を少なくするのにとても有効です。

『自分はそんなミスはしないから大丈夫』

個人で運用しているメールであれば、そういった自信があれば問題ありません。
が、会社や団体などの組織の場合、『すべての人が何のミスもなくメールを運用している!』という保証はどこにもありません。

大手企業ならまだしも、多くの組織にはセキュリティの監視をするための部署や担当者さえいないのが現状で、誤送信の事故は頻繁に発生しています。

添付ファイルを暗号化しておいて、パスワードメールを別に送るようにルール化することは必ずしも無駄とは限らないのです。

Outlookをご利用の場合
https://seasoft.co.jp/products/BizAttacher.html

Becky!をご利用の場合
https://seasoft.co.jp/products/BkBizAttacher.html

これらのソフトで誤送信の事故を未然に防ぐのはいかがでしょう?
以上、CMでした。