月別アーカイブ: 2011年4月

[C#]アプリケーションのUAC対応

アプリケーション側で一般権限と管理者権限とで挙動を変えたい場合のメモ

  1. WindowsVista以降(UAC搭載OS)で起動されているか
    アプリケーションがWindowsVista以降で起動されているかどうかをOSのバージョン情報から判断する 

    using System;
    
    private bool IsUAC()
    {
        OperatingSystem osInfo = Environment.OSVersion;
        if (osInfo.Platform == PlatformID.Win32NT)
        {
            if (osInfo.Version.Major == 6)
            {
                if (osInfo.Version.Minor == 0)
                {
                    // Windows Vista, Windows Server 2008
                    return true;
                }
                else if (osInfo.Version.Minor == 1)
                {
                    // Windows 7, Windows Server 2008 R2
                    return true;
                }
            }
            else if (osInfo.Version.Major > 6)
            {
                // new Windows
                return true;
            }
        }
    
        return false;
    }
    
  2. アプリケーションが管理者権限で起動されているか
    アプリケーションが「管理者として実行…」されているとき 

    using System.Security.Principal;
    
    private bool IsAdministrator()
    {
        bool isAllowed = false;
    
        try
        {
            WindowsIdentity wi = WindowsIdentity.GetCurrent();
            WindowsPrincipal wp = new WindowsPrincipal(wi);
            isAllowed = wp.IsInRole(WindowsBuiltInRole.Administrator);
        }
        catch
        {
            isAllowed = false;
        }
    
        return isAllowed;
    }
    
  3. アプリケーションを起動したユーザーはAdministratorsグループに属しているか
    アプリケーションは一般権限で起動されていたとしても起動したユーザーが管理者に昇格可能かどうか知りたいとき 

    using System.DirectoryServices.AccountManagement;
    
    private bool IsAdministrators()
    {
        bool isAllowed = false;
    
        try
        {
            PrincipalContext pc = new PrincipalContext(ContextType.Machine, null);
            UserPrincipal up = UserPrincipal.Current;
            GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc, "Administrators");
            if (up.IsMemberOf(gp))
            {
                isAllowed = true;
            }
        }
        catch
        {
            isAllowed = false;
        }
    
        return isAllowed;
    }
    

    上のコードだといくつかの環境でうまく動いていないっぽい?下のコードのほうが確実かも。

    using System.DirectoryServices.AccountManagement;
    
    private bool IsAdministrators()
    {
        bool isAllowed = false;
    
        try
        {
            PrincipalContext pc = new PrincipalContext(ContextType.Machine, null);
            UserPrincipal up = UserPrincipal.Current;
            foreach (GroupPrincipal gp in up.GetGroups())
            {
                try
                {
                    if (gp.Name.ToLower().Equals("Administrators".ToLower()))
                    {
                        isAllowed = true;
                    }
                }
                finally
                {
                    gp.Dispose();
                }
            } 
        }
        catch
        {
            isAllowed = false;
        }
    
        return isAllowed;
    }
    
  4. アプリケーションを管理者権限で再起動する
    処理を行う際に管理権限が必要となった場合に自分自身を管理者権限で再起動する 

    using System;
    using System.Diagnostics;
    
    private void RestartApplication()
    {
        ProcessStartInfo psi = new ProcessStartInfo();
        psi.UseShellExecute = true;
        psi.WorkingDirectory = Environment.CurrentDirectory;
        psi.FileName = Application.ExecutablePath;
        psi.Verb = "runas";
    
        try
        {
            Process p = Process.Start(psi);
        }
        catch
        {
            return;
        }
    
        Application.Exit();
    }
    
  5. 管理者権限が必要になるボタンにUAC(盾)のアイコンを表示する
    操作の続行に管理者権限が必要になることをユーザーに知らせるためボタンにUAC(盾)のアイコンを表示する
    (SystemIcons.Shieldプロパティの盾アイコンとWin32APIの盾アイコンには差があり、Windows 7で標準的に使われているのはWin32 APIのほうである。) 

    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace Sample
    {
        public partial class Form1 : Form
        {
            [DllImport("user32.dll")]
            private static extern IntPtr SendMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    
            // 第2パラメータ:盾アイコンを設定するフラグ
            uint BCM_SETSHIELD = 0x0000160C;
    
            public Form1()
            {
                InitializeComponent();
    
                // ボタンの外観を「System」にする必要がある
                button1.FlatStyle = FlatStyle.System;
            }
    
            private void checkBox1_CheckedChanged(object sender, EventArgs e)
            {
                // 第1パラメータ:ボタンのウィンドウ・ハンドル
                HandleRef hwnd = new HandleRef(button1, button1.Handle);
    
                if (checkBox1.Checked)
                {
                    SendMessage(hwnd, BCM_SETSHIELD, new IntPtr(0), new IntPtr(1));
                }
                else
                {
                    SendMessage(hwnd, BCM_SETSHIELD, new IntPtr(0), new IntPtr(0));
                }
            }
        }
    }
    

Touch Diamond 環境構築メモ その7

ラジオを使えるようにしたときの設定メモ
FMラジオ

  • DLLの入れ替え

    アンテナの感度が少し良くなるので入れておく。

    1. 1.09.25.23 rilphone.cabをTouch Diamondに転送して実行
  • Bandの制限解除

    元のままでは設定化の範囲が87.5~108.0MHzなので日本の周波数帯である76.0~90.0MHzの一部が設定できないのでレジストリの値を変更することで選択可能にする。

    1. FM_JP.cabをTouch Diamondに転送して実行
      [HKEY_LOCAL_MACHINE\Software\HTC\FMRadio\FMPlayer]
      “Band”=dword:00000001
      
  • 普段使ってるイヤホンでFMラジオ聞く

    オーディオUSBアダプタ「スリム」を利用すると付属のマイク付きイヤホンでなくてもラジオを聴くことができる。

    1. オーディオUSBアダプタ「スリム」を購入する。

参考:Japan非対応のFMラジオの周波数帯を日本対応に変更

Touch Diamond 環境構築メモ その6

SMSとEMnetメールの設定について書いてほしいとリクエストを受けたので記載。
SMS受信確認設定画面

  • ArcMMSの削除

    DelArcMMS.mscrを実行して、ArcMMS関連を削除する

    1. DelArcMMS.mscrをTouch Diamondに転送して実行
      (BsB6.5.1GにはMortScriptがすでに入っているため実行できるはずですが、できない場合はMortScript-4.2-PPC.cabをインストール後に実行してください。)
  • MMS Liteインストールの下準備

    PreSetupMMSLite.exeを実行してMMS LiteでSMSを受信できるようにしたりするレジストリ情報を書き込む。

    1. PreSetupMMSLite.zipを解凍し、PreSetupMMSLite.exeをTouch Diamondに転送して実行
  • MSS Liteのインストール

    MMSLite.1.1.320.wm6.cabをインストールしてSMSとMMSを利用できるようにする

    1. MMSLite.1.1.320.wm6.cabをTouch Diamondに転送して実行
  • MMSLiteの設定

    MMSLite.mscrを自分の環境合わせて書き換えて実行し、設定を反映させる

    1. MMSLite.mscrをダウンロードし、メールアドレスなどを修正する
      Case(YES) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "AllowDeliveryReport" , 1 ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "AllowReadReport" , 1 ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "AutoRetry" , 1 ) 
      RegWriteString( "HKCU", "Software\MMS Lite\Profiles\MMS", "EmailAddres", "自分のメールアドレス@emnet.ne.jp" ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "ForceAutoRecv" , 1 ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "ForceConnect" , 0 ) 
      RegWriteString( "HKCU", "Software\MMS Lite\Profiles\MMS", "MmsGateway", "10.56.46.1:8080" ) 
      RegWriteString( "HKCU", "Software\MMS Lite\Profiles\MMS", "MmsServer", "http://mms.internal.emnet.ne.jp" ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "MsgDurationPeriod" , 0 ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "RequireDeliveryReport" , 0 ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "RetryCount" , 0 ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "RetryTimeout" , 30 ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "SaveSent" , 1 ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS", "ServerPort" , 80 ) 
      RegWriteString( "HKCU", "Software\MMS Lite\Profiles\MMS\UserAgent", "Default", "S21HT" ) 
      RegWriteString( "HKCU", "Software\MMS Lite\Profiles\MMS\UserAgent", "S21HT", "S21HT/ArcSoft-MMSUA-PPC-v50" ) 
      RegWriteDword( "HKCU", "Software\MMS Lite\Profiles\MMS\Connections", "EMnet" , 0 )
    2. 修正したMMSLite.mscrをTouch Diamondに転送して実行
  • 設定の確認

    設定が反映されているか確認する

    1. 「使用する接続を選択:」にはEMnetのものが選択されていること
    2. 「メールアドレス:」には電話番号が表示されているだろうけど、レジストリ情報にアドレスが記録されているので送信には問題ないようだけれど気になる人はアドレスに変更。

参考:ROM焼きしたTouch Diamond(S21HT)でEMnetメール。