検索 
2010年9月5日 ..:: ブログ ::..   ログイン


 chack のブログ
Google Developer Day と VSUG Day
イベント By : Akira INOUE   Date : 2007/05/30 21:48

明日、5/31は

Google Developer Day 2007
http://code.google.com/events/developerday/jp-home.html

明後日、6/1は

VSUG Day 2007 Summer
http://vsug.jp/tabid/151/Default.aspx

に出没してきます。

なお、VSUG Day のほうはまだまだ参加受付中ですので、興味のある方はぜひ!!

というわけで、2日間本業から離れますー。

 


PDC 07 中止
イベント By : Akira INOUE   Date : 2007/05/26 12:17

既にいろいろなところで書かれていますが、1年おきに開催されていた PDC (Professional Developer Conference) が今年は中止になってしまいました。

PDC 07 (MSDN Web Site)
http://msdn2.microsoft.com/en-us/events/bb288534.aspx

今年は 10 月に LA で開催が予定されていたのですが、残念です。
(って言っても、参加する予定はありませんでしたが・・・ LA だし・・・)

これで、PDC の数ヶ月後に日本で開催されていた Microsoft Developers Conference も、おそらく開催されないんでしょうね。あ~ぁ。

 


[ASP.NET AJAX] Timer コントロールは UpdatePanel の外に配置しよう
ASP.NET AJAX By : Akira INOUE   Date : 2007/05/19 18:59

ASP.NET AJAX Extensions の Timer コントロールを使用する場合には、UpdatePanel コントロールの内部に配置すべきではないようです。

いくつか、UpdatePanel 内に Timer コントロールを配置してる例もありますが、可能なら Timer コントロールは UpdatePanel の外に配置して、UpdatePanel の Triggers コレクションで Timer の Tick イベントをトリガに設定しましょう

以下は、Timer を UpdatePanel 内に配置したサンプルです。

Timer1.jpg

aspxファイル

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
  Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
                      "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>TimerSample1CS</title>
</head>
<body>
  <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <div>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
      <ContentTemplate>
        <asp:Timer ID="Timer1" runat="server" Interval="5000"
                                              OnTick="Timer1_Tick">
        </asp:Timer>
        <asp:Label ID="Label1" runat="server" Text="未更新"></asp:Label>
      </ContentTemplate>
    </asp:UpdatePanel>
    </div>
  </form>
</body>
</html>

C#コードビハインドファイル

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
  }

  protected void Timer1_Tick(object sender, EventArgs e)
  {
    Label1.Text = DateTime.Now.ToString();
  }
}

これを実行すると下図のように5秒間隔で時刻表示が更新されます(図ではちょっとわかりづらいですが)。

Timer2.jpg

ここで、5秒ごとにサーバとどのような通信がおこなわれているか見てみます。

ちなみに、ツールには Web Development Helper を使っています。
http://projects.nikhilk.net/Projects/WebDevHelper.aspx

Web Development Helper のログは以下のようになります。

Timer3.jpg

2回の Tick イベントによるサーバとの通信をキャプチャしていますが、1回の非同期ポストバックで2回の通信がおこなわれています

Default.aspx は当然ですが、その後の ScriptResource.axd?d=... は何でしょうか?
実はこれ、Microsoft AJAX Library の MicrosoftAjaxTimer.js という JavaScript ファイルです。

Timer コントロールは、サーバサイドで Sys.UI._Timer という JavaScript ライブラリに置き換えられ、クライアントサイドで実行されます。通常は、ページのロード時に1回だけスクリプトがダウンロードされれば済むわけですが、ここでは UpdatePanel 内に Timer コントロールを配置したことにより、UpdatePanel 内部のコントロールは非同期ポストバックで常にレンダリングされ、その対象に Timer コントロールも含まれてしまっているわけです。

これでも、更新間隔が非常に長かったり、負荷が問題にならない状況でしたら良いのでしょうが、なんか無駄ですよね。

この無駄をなくすには、次のように Timer コントロールを UpdatePanel の外に配置して、UpdatePanel の Triggers コレクションで Timer の Tick イベントをトリガに設定することで回避できます。

Timer4.jpg

aspxファイル

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
  Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
                      "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>TimerSample1CS</title>
</head>
<body>
  <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <div>
      <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
          <asp:Label ID="Label1" runat="server" Text="未更新"></asp:Label>
        </ContentTemplate>
        <Triggers>
          <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
        </Triggers>

      </asp:UpdatePanel>
      <asp:Timer ID="Timer1" runat="server" Interval="5000"
                                            OnTick="Timer1_Tick">
      </asp:Timer>
    </div>
  </form>
</body>
</html>

Image5.jpg

今度は、Web Development Helper のログは以下のようになり、Default.aspx のみの通信となり、毎回 MicrosoftAjaxTimer.js ファイルがダウンロードされることがなくなりました。

Image6.jpg

この Timer コントロールは、Interval の単位がミリ秒だったりと(実際は1秒以下のポストバックは発生しないようですが)、サーバ負荷を十分考慮した設計をしないと、とんでもないことになりますので注意しましょう。

 


[ASP.NET AJAX] ASP.NET Futures の Managed JScript を試す
ASP.NET AJAX By : Akira INOUE   Date : 2007/05/17 11:24

ちょっと AJAX と XML-Script 関連で調べたいことがあったので、先日リリースされた ASP.NET Futures (May 2007) をインストールしてみました。

ツールボックスには、次のようなコントロール群が登録されます。

Futures0.jpg

 

また、Web サイトの新規作成では、テンプレートに

  • ASP.NET Futures AJAX Web Site
  • ASP.NET Futures Web Site
  • Dynamic Data Web Site

の3つが新たに登録されていました。

さらに、言語には

  • IronPython
  • Managed JScript

の2つが新たに出現(うおーっ!)。

Futures1.jpg

 

早速、Managed JScript やらを試してみました。

テンプレートには「ASP.NET Futures AJAX Web Site」を選択して、新規Webサイトを作成。

ソリューションには、次のようなファイルが現れました。

Futures2.jpg

拡張子 *.jsx が、Managed JScript のサーバサイドのスクリプトコードです。


とりあえず、よくあるパターンで TextBox, Label, Button, UpdatePanel を配置して・・・

Futures3.jpg

Default.aspx はこんな感じ。

<%@ Page Language="ManagedJScript" CodeFile="Default.aspx.jsx"
    Inherits="Microsoft.Web.Scripting.UI.ScriptPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  <title>Untitled Page</title>
</head>
<body>
  <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <div>
   <asp:TextBox ID="TextBox1" runat="server" Width="250px"></asp:TextBox>
  <asp:UpdatePanel ID="UpdatePanel1" runat="server">
   <ContentTemplate>
    <asp:Label ID="Label1" runat="server" Width="250px"></asp:Label>
<br />
    <asp:Button ID="Button1" runat="server" Text="Click Me!" />
   </ContentTemplate>
  </asp:UpdatePanel>
 </div>
  </form>
</body>
</html>

Default.aspx.jsx はこんなコーディングをして、

function Page_Load(sender, e){
  if (Page.IsPostBack){
    Label1.Text = "Hello " + TextBox1.Text + " !!";
  }
}

さて、実行。

Futures4.jpg

ちゃんと動きました~。

#さて、本題をやらないと・・・


VSUG Day 2007 Summer 開催!
イベント By : Akira INOUE   Date : 2007/05/09 10:25

Visual Studio User Group (VSUG) のオフラインイベント、
VSUG Day 2007 Summer」が 2007年6月1日(金)に開催されます。

詳細、お申し込み(無料)はこちらです。
http://vsug.jp/tabid/151/Default.aspx

時期 VS Orcas や Silverlight, Expression Blend など、今話題の技術セッションが盛りだくさんです。

興味のある方はぜひ!!

 


Tech・Ed 2007 Yokohama 参加登録開始です!
イベント By : Akira INOUE   Date : 2007/05/02 21:26

今年も、Microsoft Tech・Ed の季節がやって来ました。
といっても、8月の話なのですが・・・。

すでに、オフィシャルホームページでは、参加登録が可能となっています。

今年は、料金体系が少し変わって、「フル エクスペリエンス パッケージ」と「リミテッド パッケージ」の2種類となっていて、「リミテッド パッケージ」は、な、なんと早期割引で 25,000円!!
特典内容にはいろいろと制限があるのですが、とりあえず Tech・Ed に参加してみたいという方にはおすすめです。

私は、毎年のごとく、隅から隅まで堪能したいので、「フル エクスペリエンス パッケージ」(73,000円)です・・・・。

あぁぁぁ、予算が・・・・

※ バナーも用意されてますよー。

bnr_teched_120-240.gif

 


[DotNetNuke] HTML ヘッダに <link rel="alternate" ... />要素を追加して RSS 配信する
DotNetNuke By : Akira INOUE   Date : 2007/04/19 16:00

DotNetNuke のモジュールのいくつかは、RSS フィードを使った配信が可能になっています。
しかし、HTML ヘッダに <link rel="alternate" ... /> を使った URL の記述が行われないため、RSS リーダーなどでフィードが自動認識されません。

以下の図は、IE7 にて DotNetNuke の Blog モジュールのページを表示した状態です。
XML アイコンが表示され、RSS フィードは配信されていますが、IE7 では認識されていません。

no_header.jpg

これを改善するには、DotNetNuke のページ設定で、ページヘッダータグの記述を追加します。

  1. DotNetNuke に管理者でログオンして、ヘッダを追加するページの「ページ設定」を開きます。

    page_setting.jpg

  2. 「ページ設定」で「高度な設定」を開きます。

    page_setting2.jpg

  3. 「ページ ヘッダー タグ」に下記の記述を追加して、ページ設定を更新します。

    <link rel="alternate" type="application/rss+xml" title="(タイトル)" href="(RSSフィードURL)" />

    page_setting3.jpg

  4. RSSフィードが自動認識されます。

    page_setting4.jpg

 

これで、RSS リーダーなどのブックマークレットなどでも認識され、簡単に購読設定が可能となります。

なお、一つのページで複数の RSS フィードを配信している場合でも、上記のタグをそれぞれの RSS フィード URL を使って複数記述すれば配信可能です。

 


Hello Silverlight !!
ソフトウェア By : Akira INOUE   Date : 2007/04/16 20:52

WPF/E ( Windows Presentation Foundation Everywhere ) の名称が Silverlight に変わり正式発表されました。

Microsoft Silverlight
http://www.microsoft.com/silverlight/default_01.aspx

Microsoft Silverlight

名前、かっこいいです。
(というか、WPF/E ってコードネームだったんですね。知らなかった・・・orz)

あとは、どの程度普及していくかですが、個人的には、けっこう楽しみでもあります。

※上記サイトから、早速壁紙もダウンロードしました♪

 


[AJAX Control Toolkit] Popup 関連のコントロールが IE 100%表示以外で位置がずれる
ASP.NET AJAX By : Akira INOUE   Date : 2007/04/09 11:25

ASP.NET 2.0 AJAX の応用として CodePlex にてリリースされている AJAX Control Toolkit には、多くの有用なコントロールが含まれています。

AJAX Control Toolkit
http://www.codeplex.com/AtlasControlToolkit

ただ、PopupControl 関連のコントロールには、現在のバージョン(2007-03-01 Release)では Internet Explorer のページ倍率を 100% 以外にすると、ポップアップウィンドウの表示位置がずれてしまい正しく表示されない不具合があるようです。

例えば、下記のページ
http://ajax.asp.net/ajaxtoolkit/Calendar/Calendar.aspx
の Calendar コントロール (CalendarExtender) のデモで試してみると、IE の表示倍率が 100% の場合はカレンダーが正しい位置にポップアップされます。

Cal100.jpg
Fig : CalendarExtender (IE 100% View)

しかし、例えば 125% 表示で試すと、カレンダーの表示位置が正しい位置より、より大きくオフセットされて表示されてしまいます。

Cal125.jpg
Fig : CalendarExtender (IE 125% View)

 

DropDown コントロール (DropDownExtender)
http://ajax.asp.net/ajaxtoolkit/DropDown/DropDown.aspx
でも、以下のようになってしまいます。

Drop100.jpg
Fig : DropDownExtender (IE 100% View)

 

Drop125thumb.jpg
Fig : DropDownExtender (IE 125% View)

正式に Fix されるまで、使用には注意が必要です。

 


Microsoft Expression シリーズが MSDN Premium 以上で提供
ソフトウェア By : Akira INOUE   Date : 2007/04/04 10:54

Microsoft Expression シリーズが MSDN Premium 以上で提供されるようです。

ネタ元:Expression web design applications now available on MSDN
http://blogs.technet.com/seanearp/archive/2007/04/03/expression-web-design-
applications-now-available-on-msdn.aspx

私は Visual Studio Team Edition for Software Developers を契約しているので、とりあえず Expression Web と Blend は入手出来る模様(個人的には Design も欲しかった~)。

これで、WPF ( XAML ) がますます楽しめそうです。よかったよかった。

 


[ASP.NET AJAX] クライアントスクリプトからの Web サービスの非同期呼び出し
ASP.NET AJAX By : Akira INOUE   Date : 2007/03/28 20:31

ASP.NET AJAX をいろいろと調べていまして、そのメモを兼ねて一つ記事をアップします。

[The Official Microsoft ASP.NET 2.0 Site] にあるサンプル
「How Do I: ASP.NET AJAX Enable an Existing Web Service?」
http://www.asp.net/learn/videos/view.aspx?tabid=63&id=82

などでは、

function Button1_onclick() {
ret = SimpleService.SayHello(document.getElementById('Text1').value,
                             OnComplete, OnTimeOut, OnError);
return(true);
}

などと、Web メソッドの非同期呼び出しを記述しています。

幸いなこと(?)に JavaScript ではエラーとならずに実行されるのですが、正確にはこの記述は間違いです(以前の Atlas 時代の形式です)ので注意してください。

正確には、プロキシを使った Web サービスの呼び出しのプロトタイプは

myServiceProxy.MyServiceMethod(param1, ... , paramN,
               SucceededCallback, FailedCallback, userContext)

となっています。

参考:Generated Proxy Classes Web Service Methods
http://ajax.asp.net/docs/ClientReference/Sys.Net/GeneratedProxyClasses/
WebServiceMethods.aspx

サンプルのままだと、コールバック関数の OnComplete は問題ないのですが、タイムアウトでの処理のつもりで書いたコールバック関数 OnTimeOut がエラー発生時にも呼び出されてしまいます。

最新の ASP.NET AJAX では、タイムアウトとエラー発生時のコールバックは統一されており、同じ関数が呼び出されるようになっています(プロトタイプでは FailedCallback 引数に指定した関数)。

私は、このサンプルのデモムービーを見ていて、ちょっと混乱しました・・・


さて、参考までに・・・

ASP.NET AJAX を使って、クライアントサイドのスクリプトから Web サービスを呼び出すには、Web サービスのメソッドに System.Web.Script.Services 名前空間の ScriptService 属性 (ScriptServiceAttribute)が必要となります。

[ SimpleService.cs ]

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class SimpleService : System.Web.Services.WebService
{
  [WebMethod]
  public string SayHello(string name)
  {
    return "Hello : " + name;
  }
}

そして、aspx ソースに asp:ScriptManager を追加して、その子要素に Services/asp:ServiceReference を下記のように追加すると、Web サービスの呼び出しに必要な JavaScript プロキシコードが生成されます。

[ Default.aspx ]

<asp:ScriptManager runat="server" ID="scriptManager">
  <Services>
    <asp:ServiceReference Path="SimpleService.asmx" />
  </Services>
  <Scripts>
    <asp:ScriptReference Path="UsingSimpleService.js" />
  </Scripts>
</asp:ScriptManager>

生成されたプロキシスクリプトを使うと、クライアントサイドのスクリプトで Web サービスの非同期の呼び出しが、下記のコードのように簡単に行えるようになります。

[ UsingSimpleService.js ]

function pageLoad()
{
  SimpleService.set_timeout(3000);
  SimpleService.set_defaultUserContext("Default context");
  SimpleService.set_defaultSucceededCallback(SucceededCallback);
  SimpleService.set_defaultFailedCallback(FailedCallback);
}

function Button1_onclick()
{
  SimpleService.SayHello(document.getElementById("Text1").value);
}

function Button2_onclick()
{
  SimpleService.SayHello(document.getElementById("Text1").value,
                         SucceededCallback,
                         FailedCallback,
                         "User context");
}

function SucceededCallback(result, userContext, methodName)
{
  var text = result + " (" + userContext + ")" + " [" + methodName + "]";

  document.getElementById("Label1").innerText = text;
}

function FailedCallback(error, userContext, methodName)
{
  var text = "Service Error : " +  error.get_message() +
             " (" + userContext + ")" + " [" + methodName + "]";

  document.getElementById("Label1").innerText = text;
}

このプロキシを使った Web サービスの呼び出しでは、pageLoad で行っているように、プロキシの set_defaultXXXX メソッドで、コールバック関数を指定して Button1_onclick で Web サービスメソッドの呼び出しのみを行う方法と、Button2_onclick で行っているように Web サービスの呼び出し時にコールバック関数を指定することもできます。

ここで、プロキシを使った Web サービスの呼び出しのプロトタイプは前述のように

myServiceProxy.MyServiceMethod(param1, ... , paramN,
               SucceededCallback, FailedCallback, userContext);

となります。

また、各コールバック関数のプロトタイプは下記の通りとなります。

function SucceededCallback(result, userContext, methodName);
function FailedCallback(error, userContext, methodName);


ASP.NET AJAX は、UpdatePanel を使えばとても簡単に Web アプリケーションの AJAX 化ができるのですが、本格的な ASP.NET AJAX アプリケーションを作り始めると、やはりいろいろと奥が深いところがあり楽しいですね。

【参考】
Generated Proxy Classes
http://ajax.asp.net/docs/ClientReference/Sys.Net/GeneratedProxyClasses/default.aspx

 


UAC の昇格確認ダイアログのスクリーンショットを取る方法
Windows Vista By : Akira INOUE   Date : 2007/03/22 17:14

ユーザーアカウント制御 (User Account Control) 機能による昇格時の確認ダイアログは、セキュリティで保護されたデスクトップ(背景が暗くなった状態で UAC の昇格確認ダイアログだけがアクティブになったデスクトップ)で表示されるため、簡単にスクリーンショットを取ることができません。

私は、今まで UAC の昇格確認ダイアログのスクリーンショットだけは、Virtual PC 2007 上で起動した Windows Vista を使って作成していました。

でも、こんな方法もあるんだな、ということでご紹介。

  1. コントロールパネルの「システムとメンテナンス」-「管理ツール」で「ローカル セキュリティ ポリシー」を開きます。
  2. ウィンドウ左側のツリーで、「セキュリティの設定」-「ローカル ポリシー」-「セキュリティ オプション」を開き、右側の「ポリシー」リストで「ユーザーアカウント制御:昇格のプロンプト時にセキュリティで保護されたデスクトップに切り替える」を探し、ダブルクリックします。
  3. 「ローカル セキュリティの設定」タブで、デフォルトでは「有効」になっていますが、これを「無効」に変更します。

uac2.jpg

この設定であれば、Snipping Tool などで簡単に UAC 制御のダイアログのスクリーンショットを取ることができます。

但し、セキュリティで保護されたデスクトップでは Aero が無効になっているため、UAC の昇格確認ダイアログも半透明ではないウィンドウ表示なのですが、セキュリティで保護されたデスクトップを使用しない場合の UAC の昇格確認ダイアログは、Aero が有効になっていると半透明のウィンドウ表示となってしまいます。

 


UAC を無効化しないで 管理者での昇格確認ダイアログを表示させない方法
Windows Vista By : Akira INOUE   Date : 2007/03/22 16:49

※ネタ元
http://japan.zdnet.com/sp/feature/shinder/story/0,2000087897,20342824-6,00.htm

ユーザーアカウント制御 (User Account Control) 機能は、Windows Vista のセキュリティ機能の中で最も重要なものですが、管理者としてログオンしていても許可を求めるダイアログが表示され、面倒に思うこともあるでしょう。

ユーザーアカウント制御 (UAC) は、コントロールパネルの「ユーザーアカウント」-「ユーザーアカウント制御の有効化または無効化」で無効にすることもできますが、Vista のセキュリティ設定上あまりおすすめできません。

そこで、ユーザーアカウント制御機能は有効にしたまま、管理者としてログオンしている場合にのみ、以下の方法で昇格確認ダイアログを表示させないようにすることができます(自動的に昇格する)。

  1. コントロールパネルの「システムとメンテナンス」-「管理ツール」で「ローカル セキュリティ ポリシー」を開きます。
  2. ウィンドウ左側のツリーで、「セキュリティの設定」-「ローカル ポリシー」-「セキュリティ オプション」を開き、右側の「ポリシー」リストで「ユーザーアカウント制御:管理者承認モードでの管理者に対する昇格時のプロンプト動作」を探し、ダブルクリックします。
  3. 「ローカル セキュリティの設定」タブのドロップダウンリストではデフォルトで「同意を要求する」が選択されていますが、これを「確認を要求しないで昇格する」に変更します。

uac1.jpg

これで、管理者ユーザーでは、UAC の昇格確認ダイアログが表示されなくなります。
※標準ユーザーでは、これまでどおり UAC の昇格ダイアログが表示され、管理者パスワードを入力しないと昇格できません。

管理者として常にログオンしているのであれば、覚えておいて損はないと思います。

 


UAC (User Account Control) と C/C++ MFC アプリケーション(その2)
Programming By : Akira INOUE   Date : 2007/03/19 17:15

前回の記事「UAC (User Account Control)と C/C++ MFC アプリケーション(その1)」の続きです。

前回は、Application ManifestsVirtualization について解説しました。今回は、それらの組み合わせによるアプリケーションの挙動についてサンプルアプリケーションを元に解説します。

マニフェストなし、または requestedExecutionLevel 要素記述なしの場合

この場合は、Virtualization 機能により、権限のないフォルダやレジストリキーへの書き込みがリダイレクトされ、エラー無く実行されます。ただし、この場合に注意が必要なのは、インストール時に設定情報などのファイルを %PorgramFiles% のインストールフォルダにインストールし、そのファイルをアプリケーション実行時に読み書き可能なモードで開いたりした場合に、%USERPROFILE%\AppData\Local\VirtualStore\Program Files\ 以下のフォルダにリダイレクトされるので、設定情報が読み込めないなどの不具合が発生する可能性があります。

図:サンプルアプリケーションの実行(マニフェスト無しの場合)
AppNoManifest.JPG

C:\Program Files\BitWiz\test.txt の作成に成功している(上図)が、C:\Program Files\BitWiz には test.txt が生成されていない(下図)。

図:サンプルアプリケーションの実行フォルダ
NoManifestFolder.JPG

Virtualization(仮想化)機能により、C:\Users\\AppData\Local\VirtualStore\Program Files\BitWiz フォルダに test.txt が生成されている(下図)。

図:C:\Users\\AppData\Local\VirtualStore\Program Files\BitWiz フォルダ
NoManifestVirtualStore.JPG

サンプルアプリケーションの実行結果では、HKEY_LOCAL_MACHINE\SOFTWARE\BitWiz のレジストリキーのオープン(KEY_ALL_ACCESS)に成功しているが、実際は HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\BitWiz キーがオープンされて値が取得されている。

図:レジストリキーのリダイレクト
NoManifestRegVirtualStore.JPG


マニフェストありで、requestedExecutionLevel 要素記述ありの場合

Virtualization 機能は無効となり、仮想化(ファイルやレジストリのリダイレクション)は行われません。

asInvoker
requestedExecutionLevel 要素の level 属性値を asInvoker とした場合、親プロセスと同じ特権で実行されるため、書き込み権限のない C:\Program FilesHKEY_LOCAL_MACHINE への書き込みなどはエラーとなります。

図:サンプルアプリケーションの実行(マニフェストあり(asInvoker)の場合)
AppAsInvoker.JPG

asInvoker 属性値により権限の昇格なしで実行されているため、ファイルの作成、レジストリキーのアクセスともに失敗している。Virtualization 機能も無効となり、リダイレクトも行われない。

highestAvailable / requireAdministrator
requestedExecutionLevel 要素の level 属性値に highestAvailablerequireAdministrator とすると、実行時に UAC 昇格確認ダイアログが表示される。
ここで、実行を許可すると C:\Program FilesHKEY_LOCAL_MACHINE への書き込みなどが可能となる。

図:実行時の UAC ダイアログ
UACDialog.jpg

実行時に必ず UAC 昇格確認ダイアログが表示される(上図)。

図:サンプルアプリケーションの実行(マニフェストあり(requireAdministrator)の場合)
AppRequireAdministrator.JPG

ファイルの作成、レジストリキーのアクセス共に成功している(上図)。

図:サンプルアプリケーションの実行フォルダ
AdminFolder.JPG

C:\Program Files\BitWiz\test.txt が生成されている。
また、マニフェストの requireAdministrator 属性値により、自動でアプリケーションアイコンにシールドアイコンが表示され、権限の昇格を行わないと実行できないことがわかる(上図)。

図:HKEY_LOCAL_MACHINE レジストリキーへのアクセス
AdminReg.JPG

指定どおり、HKEY_LOCAL_MACHINE\SOFTWARE\BitWiz レジストリキーのオープン(KEY_ALL_ACCESS)に成功している(上図)。


インストーラ検出技術の条件に一致した場合

基本的には requestedExecutionLevel 要素の level 属性値が優先されますが、この要素記述が無い場合は "install" "setup" "update" などのキーワードがファイル名やバージョンリソースに含まれるとインストーラと判断され、UAC 昇格確認ダイアログが表示されることとなります。

図:ファイル名に "Setup" という文字列を含んだアプリケーション
SetupApp.JPG

マニフェストに requestedExecutionLevel 要素の記述を行っていないが、アプリケーションアイコンにシールドアイコンが表示されている(上図)。

図:インストーラとして検出されたアプリケーションの終了後に表示される確認ダイアログ
SetupAppAfter.JPG

アプリケーション実行終了後、正しくインストールされたかの確認ダイアログが表示される(上図)。

さて、アプリケーションがインストーラとして検出される条件はどのようになっているのでしょうか?

以下は
「Installer Detection Technology」
http://technet.microsoft.com/en-us/windowsvista/aa905117.aspx
からの抜粋です。

Installer Detection only applies to:

1. 32 bit executables
2. Applications without a requestedExecutionLevel
3. Interactive processes running as a Standard User with LUA enabled

Before a 32 bit process is created, the following attributes are checked to determine whether it is an installer:

- Filename includes keywords like "install," "setup," "update," etc.
- Keywords in the following Versioning Resource fields: Vendor, Company Name, Product Name, File Description, Original Filename, Internal Name, and Export Name.
- Keywords in the side-by-side manifest embedded in the executable.
- Keywords in specific StringTable entries linked in the executable.
- Key attributes in the RC data linked in the executable.
- Targeted sequences of bytes within the executable.

ファイル名だけでなはく、バージョンリソースなどに含まれるキーワードでも判断されるようです。

UAC 対応のシナリオ

■ 意図的に仮想化(Virtualization)させる場合

アプリケーションマニフェストに requestedExecutionLevel 要素の記述を行わない。
※注意点
インストール時等に C:\Program Files にコピーされたファイルなどへの読み書きを前提にしている場合、そのファイルをWriteで開く時点で C:\Users\\AppData\Local\VirtualStore\Program Files\ にリダイレクトされるので、ファイルが存在しないなどのエラーとなる。

■ 仮想化(Virtualization)を行わずに、且つファイルやレジストリへのアクセス権限も正しく行っていて、管理者権限での実行が不要な場合。もしくは実行ファイル名に "install", "setup", "update" などの文字を含める必要があるが、インストーラとして認識されたくない場合

アプリケーションマニフェストに requestedExecutionLevel 要素の記述を行い level 属性値を asInvoker とする。

■ 仮想化(Virtualization)は行いたくないが、Program Files や HKEY_LOCAL_MACHINE などへの書き込み参照が必要な場合

アプリケーションマニフェストに requestedExecutionLevel 要素の記述を行い level 属性値を requireAdministrator とする。

■ 仮想化(Virtualization)を行い、かつファイル名などに "install", "setup", "update" などの文字を含める必要がある場合

不可能。必ずインストーラとして認識されてしまい管理者権限に昇格しないと実行できないため、この場合は仮想化を行うことはできない。

おわりに

Windows Vista 対応のアプリケーションを開発する場合、UAC への理解が必須と思われますが、慣れないうちはなかなかわかりにくいところです。
今回は、マニフェストをアプリケーションリソースに埋め込む方法でいろいろと試してみましたが、マニフェストを外部ファイルとして実行ファイルと同じフォルダに置いた場合、若干異なる動きをすることを確認しています。時間がとれればそのあたりも調べてみたいと思っていますが、とりあえずは、埋め込みマニフェストを使い、アプリケーションの権限昇格の要/不要を制御するか、Virtualization 機能を前提としたアプリケーション実装を行うことが確実でしょう。
また、Authenticode 証明書などでアプリケーションに署名を行うと、UAC の昇格確認ダイアログの表示が変わったりするのですが、今回は署名されている場合の説明は割愛します。

詳細...

UAC (User Account Control) と C/C++ MFC アプリケーション(その1)
Programming By : Akira INOUE   Date : 2007/03/19 16:45

Windows Vista の UAC (User Account Control) と、C/C++ MFC アプリケーションなどのアンマネージ(ネイティブ)アプリケーションについてまとめてみます。

既存の C/C++ & MFC アプリケーションを Windows Vista に対応させるのに、最も注意しなくてはならないのが、UAC (User Account Control) への対応でしょう。

アプリケーションマニフェストの有無やマニフェストの記述内容によって、UAC 管理下でのアプリケーションの動作がそれぞれ異なります。

Application Manifests

アプリケーションマニフェストとは、アプリケーションが実行時にバインドする共有 side-by-side アセンブリ(WinSxS フォルダにインストールされる mfc80.dll, comctl32.dll 等のネイティブライブラリ)のバージョンを指定したりするための XML ファイルです。

代表的なところでは、Windows XP でビジュアルスタイルを有効にするために comctl32.dll のバージョンを指定するのに多く使用されています。

このアプリケーションマニフェストは、実行ファイルの名前+.exe.manifest (AppName.exe.manifest) として外部 XML ファイルとすることも、アプリケーションにリソースとして埋め込むこともできます。

Visual Studio 2005 で MFC アプリケーションのプロジェクトを作成すると、stdafx.h に以下の記述が生成されて、comctl32.dll のバージョン6を使用するためのアプリケーションマニフェストがデフォルトでアプリケーションリソースとして埋め込まれるようになります。

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
    ........
#elif defined _M_X64
    ........
#else
    ........
#endif
#endif

外部 XML ファイルとしてマニフェストを用意する方法は簡単ですが、上記のようにアプリケーションリソースとしてマニフェストが埋め込まれている場合、外部マニフェストファイルを使用すると、リソースに埋め込まれたマニフェストが無効になってしまいますので注意が必要です。

MFC アプリケーションを Windows Vista の UAC へ対応させるにあたり、アプリケーションマニフェストが重要な要素となりますが、上記のようなことから、マニフェストはアプリケーションリソースに埋め込む方法を推奨します。ここでも埋め込みマニフェストを使って UAC 対応について解説していきます。

まず、UAC 対応に必要なアプリケーションマニフェストの記述例を下記に示します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="AppName"
     type="win32"/>

  <description>Description of your application</description>

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>

        </requestedPrivileges>
       </security>
  </trustInfo>

</assembly>

ここで重要なのが requestedExecutionLevel 要素の level 属性値です。

requestedExecutionLevel のスキーマは下記のとおりです。

<requestedExecutionLevel
   level="asInvoker|highestAvailable|requireAdministrator"
   uiAccess="true|false"/>

level 属性の値には以下のいずれかを記述します。

asInvoker
- アプリケーションは親プロセスと同じトークン(権限)で実行します

highestAvailable
- アプリケーションは現在のユーザが取得できる最も高い特権で実行します

requireAdministrator
- アプリケーションは管理者として実行され、管理者の完全なトークンで実行されることを要求します

通常、管理者権限への昇格が不要なアプリケーションの場合は asInvoker を使い、管理者権限で実行すべきアプリケーションの場合は requireAdministrator を使うことになるでしょう。

Visual Studio 2005 C++ プロジェクトでマニフェストファイルをリソースに埋め込むには、プロジェクトのプロパティの【構成プロパティ】-【マニフェスト ツール】-【入力と出力】で、「追加のマニフェスト ファイル」に上記のマニフェストを記述したファイルを指定するのが簡単です。ここで「埋め込みマニフェスト」が「はい」となっていることも確認してください。

図:VS 2005 プロパティページ
VS_Prop.JPG


● Virtualization

では次に、UAC 対応にあたり Windows Vista のもう一つ重要な機能を解説します。
Windows Vista では、Virtualization(仮想化)という技術により、権限のないフォルダやレジストリキーに書き込みを行った場合に単にエラーとしてしまうのではなく、各ユーザ毎に用意された書き込み可能な特別なフォルダやレジストリキーにリダイレクトして、あたかも何事もなかったかのようにアプリケーションを実行させることができます。

■ ファイルの仮想化(File Virtualization)

%PorgramFiles% などのフォルダへ、書き込み権限を持たないアプリケーションがファイルを生成しようとした場合などに、自動的に %USERPROFILE%\AppData\Local\VirtualStore\Program Files\ へリダイレクトされ、エラーとならずに実行することができます。

【例】
C:\Program Files\Hoge
へファイルを生成しようとすると、実際には

C:\Users\\AppData\Local\VirtualStore\Program Files\Hoge
へファイルが生成される。

■ レジストリの仮想化(Registry Virtualization)

HKEY_LOCAL_MACHINE などのレジストリキーに、書き込み権限を持たないアプリケーションがキーや値を生成使用とした場合、自動的に HKEY_CURRENT_USER\Software\Classes\VirtualStore へリダイレクトされ、エラーとならずに実行することができます。

【例】
HKEY_LOCAL_MACHINE\Software\Hoge
へキーを生成しようとすると、実際には

HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Hoge
へキーが生成される。

◇◇◇

さて、UAC 管理下におけるアプリケーションの挙動は、アプリケーションマニフェストの requestedExecutionLevel 要素の有無や level 属性値の記述により、いろいろと変わってきます。次回は、それらの組み合わせによるアプリケーションの挙動について解説します。

※ブログ記事としては、ちょっと長くなってしまったので、2回に別けます。

 


Visual Studio 2005 Service Pack 1 Update for Windows Vista リリース
Visual Studio By : Akira INOUE   Date : 2007/03/07 11:00

前回の記事 Visual Studio 2005 SP1 と Windows Vista で書きました Visual Studio 2005 SP1 Update for Windows Vista が正式にリリースとなりました。

Visual Studio 2005 Service Pack 1 Update for Windows Vista

Windows Vista で Visual Studio 2005 を使用する場合はこちらをインストールしましょう。

 


Visual Studio 2005 SP1 と Windows Vista
Visual Studio By : Akira INOUE   Date : 2007/02/27 18:50

最近、Windows Vista に Visual Studio 2005 SP1 をインストールしました。
Vista で Visual Studio 2005 を使うには SP1 が必要で、さらに管理者権限で実行する必要があります。

ということで、管理者権限で実行したところ、

『Visual Studio 2005 SP1 を使用するには、Windows Vista 用の更新プログラムが必要です。』

VS2005SP1.jpg

とのダイアログが表示されて、ちょっとビックリしてしまいました。
「Windows Vista 用の更新プログラム」というものが何を指しているのか知らなかったもので・・・

調べてみると、

Visual Studio 2005 Service Pack 1 Update for Windows Vista (Beta)

なるものが「Windows Vista 用の更新プログラム」に相当することがわかりました。
残念ながら現時点ではベータ版で、正式版は2007年の第1四半期を予定しているらしいです。

参考:よく寄せられる質問 : Visual Studio と Windows Vista

とりあえずはこの「Windows Vista 用の更新プログラム」ベータ版をインストールしなくても使用できるようですので、ベータ版をインストールしたくない方はもう少し我慢しましょう。

私は、近々ベータ版をインストールしてしまう予定です。
その後、

Visual Studio 2005 extensions for .NET Framework 3.0 (WCF & WPF), November 2006 CTP

をインストールして、WPF & WCF を楽しもうかと策略中...

 


Windows Vista ネットワークマップと LLTD レスポンダ
ソフトウェア By : Akira INOUE   Date : 2007/02/21 14:40

Windows Vista ではネットワークマップを表示することができ、各コンピュータのIPアドレスなどもポップアップで表示出来るので、結構便利です。
但し、このマップに適切に配置されるにはコンピュータが Link-Layer Topology Discovery (LLTD) と呼ばれる検出プロトコルに対応している必要があり、現状では Windows 系 OS では Vista しか標準で対応していません。

図では、AIVMWXP という Windows XP マシンと BITWIZ01 という Windows Server 2003 マシンがネットワークマップに配置されていません。

LLTD_B.jpg

しかし、あきらめるのはまだ早く、Windows XP 向けに LLTD レスポンダの追加コンポーネントがリリースされていますので、これをインストールすると Windows XP ベースのコンピュータもマップに配置されるようになります。

AIVMWXP という Windows XP マシンに、この LLTD レスポンダをインストールすると、次の図のようにネットワークマップに無事に配置されるようになります。

LLTD_A.jpg

さてさて、Windows 2000 や Windows Serve 2003 向けの LLTD レスポンダコンポーネントも早くリリースされませんかねー。

 


MSDN Magazine 英語版が $25 で購読できる!
ソフトウェア By : Akira INOUE   Date : 2007/02/16 19:54

先日参加した Microsoft Application Platform Summit で知ったのですが、MSDN サブスクリプション契約をしていると、送料 $25 の負担だけで英語版の MSDN Magazine が1年間購読できるらしいです。

今では Web 上で MSDN マガジン日本語版を読むことができるようになりましたが、やはり紙媒体として欲しいなと思っていました。例えば電車の中とか PC やインターネットが使えないときにも読むことができるので、時間が有効に使えるんですよね。

MSJ の頃からずっと愛読していたので、MSDN マガジンが2003年4月号で休刊になり、とても残念に思っていました。本当は日本語版の紙媒体としての復活を希望していますが、とりあえず英語版の MSDN Magazine が格安で入手できるので良しかと。

ということで早速申し込んでみました。

・・・

が、申し込みでちょっと問題発生。

MSDN のベネフィットポータルへログインして、一番下に表示されている「MSDN Magazine Subscription」のリンクをクリックしても、申し込み画面が表示されずページが再描画されるだけで、何も出来ないんです。
なんだこれ?と思い、とりあえず MSDN 事務局に問い合わせをしてみました。

回答は、「IE7 の場合、なんのメッセージも表示されずにポップアップがブロックされてしまい、申し込み画面が表示されないことがあります。」とのこと。これは IE6 だと問題ないらしいのですが・・・

ということで、IE7 のメニューで
[ツール]-[ポップアップ ブロック]-[ポップアップ ブロックを無効にする]
を行った後に試したところ、申し込みのウィンドウが表示されるようになりました。

ということで、早く送られてこないかな~と期待しつつ、一方では本当に英語の雑誌を真面目に読むのか??と一抹の不安を感じざるを得ない今日この頃なのでした・・・

 


書籍「Google ガジェットプログラミング入門」が発売となりました
お知らせ By : Akira INOUE   Date : 2007/02/08 10:00

このたび、「Google ガジェットプログラミング入門」という書籍を執筆させていただき、本日無事に発売となりました。ここで改めて関係者の皆さんにお礼を申し上げます。ありがとうございました。

昨年10月から本格的に執筆作業に取りかかっていていたのですが、途中で Google デスクトップのバージョンアップと共に SDK も変更されたり、始めは Windows XP でスクリーンショットを作成していたのを Windows Vista で作成し直したりと、いろいろ環境の変化に追従しながらの作業となりました。それでも、本当に楽しく執筆作業ができたので、良い経験となりました。

詳しくは 書籍紹介 のページを見てくださーい。

 



MCAD


techbank.jp


Copyright © 2005-2008 by BitWiz   使用条件  プライバシー