Windows 7 別のユーザとして実行

2010.02.28    Windows, 馬場      baba   

プログラムをインストールする際などは、管理者権限が必要です。

どういう環境依存だかわかりませんが、
ActiveDirectoryでUAC無効の環境で一般ユーザとしてログインしている状態で
プログラムを右クリック→管理者として実行 しても、無視されて一般権限で実行されてしまいました。

この場合は、Shiftキーを押しながら右クリックして、「別のユーザをして実行」をすれば、管理者のログインIDを入力して実行できます。
もちろん、コマンドプロンプトで「runas /user:administrator」を使っても良いですが、コントロールパネルの項目(.msc)などはこれで開けない場合もあるので、両方覚えておけば便利です。

ActiveDirectoryでパスワードを変更できなくて困った

2010.02.27    Windows, セキュリティ, 馬場   タグ: —    baba   

ActiveDirectory環境で、一般ユーザがクライアントPCでパスワードを変更するには、Ctrl+Alt+Deleteを押します。

ここでパスワードの変更を選べばパスワードが変更できるはずですが、

パスワードを変更できませんでした。新しいパスワードとして指定された値は、パスワードの長さ、複雑さ、または履歴に関するドメインの要件を満たしていません。

と言われてしまうことがあります。

この場合は、以下を試してみます。

「Windows2008」などの、複雑さの要件を満たすパスワードを入れてみる

これでOKなら、グループポリシー「パスワードは複雑性の要件を満たす必要がある」が原因です。
嫌なら、これを無効にします。

これでもだめなら、「パスワードの変更禁止期間」が邪魔をしている可能性があります。

デフォルトでは、1週間程度のパスワード変更禁止期間が設定されていて、1日2回変更しようとすると上記のエラーが出るようです。

Default Domain Policyなどで「パスワード変更禁止期間」を0日に設定すれば直りそうです。

どういうわけだか、パスワードのポリシーだけはドメインコントローラーのポリシーが適用されることもあるような、そんな挙動をするので、Default Domain PolicyとDefault Domain Controller Policyの両方で
・パスワード変更禁止期間 → 0日
・パスワードの履歴を保存する → 無効
と設定しておくと良いと思います。

もちろん、ユーザの設定で「ユーザはパスワードを変更できない」にチェックが入っていないか確認し、gpupdate /force を実行するか再起動しておく必要があります。

DNSのサフィックス設定

2010.02.26    ネットワーク, 馬場   タグ: , —    baba   

ActiveDirectoryを使う環境では、DNSサーバがSRVレコードをサポートしている必要があります。
(通常のDNSだとDomainControllerを検索する際にエラーになってしまいます)

BINDなどのDNSサーバで設定することも可能ですが、かなり面倒なので、Windows ServerをプライマリDNSにしてしまうのが手っ取り早いですね。

ところが、Windows ServerをプライマリDNSにしているActiveDirectory環境で、LANから公開サーバを検索しようとしたら、少しだけ困ったことになりました。
公開サーバ(WAN/LANの2つのIPを持つ)の名前をwwwとすると、

DNSサーバ:192.168.1.50
公開サーバ:192.168.1.10 , 203.143.124.180

期待する結果

C:> nslookup www.bpsinc.jp
サーバー: UnKnown
Address: 192.168.1.50

名前: www.bpsinc.jp
Address: 192.168.1.10

残念な結果

C:> nslookup www.bpsinc.jp
サーバー: UnKnown
Address: 192.168.1.50

名前: www.bpsinc.jp.bpsinc.jp
Address: 203.143.124.180

このように、bpsinc.jpのサフィックスが無駄にくっついてしまいます。

これは、ネットワーク設定→TCP/IP(IPv4)設定→詳細設定→DNS で、以下のようにDNSサフィックスを手動設定すれば直ります。

ローカルでここを変更してもOK

ローカルでここを変更してもOK

グループポリシーで一括設定するには、コンピュータの構成→ポリシー→管理用テンプレート→ネットワーク→DNSクライアント→DNSサフィックス検索一覧 で設定すればOKです。

グループポリシーでDNSサフィックス設定

グループポリシーでDNSサフィックス設定

もちろん、www.bpsinc.jp. のように最後にピリオドをつければ何もしなくてもOKなのですが、
WindowsのFQDN判定はあまり賢くないということでしょうか?

ウィンドウを背後に移動

2010.02.25    C++, Windows, 馬場      baba   

数年前に作ったミニアプリを公開してみました。

WinBottom

ウィンドウの最小化ボタンを右クリックすると、そのウィンドウが背面に移動するだけの常駐ソフトです。
くだらないですが、大型ディスプレイでは地味に便利です。

アイコンが猫の手なので、おすすめです。

極小なのでほとんど何も書いていないですが、もしソースが欲しい等の変な方がいたらご連絡ください。

Chromeの文字化け

2010.02.24    馬場      baba   

バージョン4になって多少は落ち着いたと思ったChromeの文字化け問題ですが、今日見たら悪化していました。

wp

激しく酷すぎますね。使い物になりません。

WordPressのCSSに書いてあるfont指定を外せば一応直りますが、根本的な解決にはなっていません。
とりあえず見たいときは、Ctrlと-を押して画面を縮小すれば読めます。

どうにかしてほしいです。

mysqlのrestartでエラー

2010.02.23    馬場   タグ: —    baba   

ubuntuでmysqlを再起動する場合、

/etc/init.d/mysql restart

とやりますが、ここで

Stopping MySQL database server: mysqld failed!

とエラーが出てしまいました。

これは、mysqlを停止する際に使うdebian-sys-maintというユーザのパスワードが間違っているのが原因です。

mysqlをインストールした際、/etc/mysql/debian.cnfにランダムなパスワード(生)が保存され、mysqlデータベースのuserテーブルにハッシュ済みデータが保存されます。
ほかのmysqlサーバからデータを移行した場合など、このuserテーブルを書き換えてしまった場合に、上記現象が発生します。

mysqlのdebian-sys-maintユーザのパスワードを、/etc/mysql/debian.cnfに書いてあるものにリセットすれば、上記エラーは解決しました。

SET NAMESが危険な理由のおさらい

2010.02.17    PHP, セキュリティ, 馬場   タグ: —    baba   

1年くらい前に社内MLに投げた、「MySQLでSET NAMESを使ってはいけない理由」をコピペしてみます。手抜きです、はい。
赤字は注釈です。


今更ながら、「MySQLで SET NAMES を使ってはいけない」の根拠のお話です。

下記のPHPスクリプトでは、入力値を元にSQL文を生成し、検索クエリを投げています。
※sqltestというDBには、カラムnameを持つuserテーブルが存在します。

GETで渡された値はきちんとmysql_real_escape_stringをかけているので、SQLインジェクションは出来ないように見えます。
しかし、
http://localhost/sqltest/index.php?name=%95%5c’%20OR%201=1%20–%20
にアクセスすると、全部のデータが見えてしまいます。
下にあるPHPスクリプトを、localhost/sqltest/index.php として配置してください。

“SET NAMES SJIS” を実行すると、MySQLのエンコードがShift-JISになりますが、mysql_real_escape_stringはUTF-8のまま動作します。
16進数で 95 5c 27 20 は、
UTF-8: (謎の文字)(バックスラッシュ)(シングルコーテーション)(スペース)
Shift-JIS: (表)(シングルコーテーション)(スペース)
になります。
mysql_real_escape_stringは、バックスラッシュとシングルコーテーションそれぞれをエスケープします。
95 5c 5c 5c 27 20
MySQLは、Shift-JISとして動作するので、 (表)(\)(\)(シングルコーテーション)(スペース) と認識します。
つまり、\が一つ余分に入ることで、入力値のシングルコーテーションがエスケープされなくなります。

マルチバイト非対応のエスケープ関数を使うのと同じ理屈で、SET NAMES は危険です。
基本的に文字コード中に5Cが入るShift-JISが危険ですが、他の文字コードでも似たようなことが起こる可能性があります。
mysql_set_charset(’SJIS’);
なら、mysql_real_escape_stringもShift-JISとして動作するようになるので、安全です。


<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>SQLテストページ</title>
<head>
</head>
<body>

<form action="<?php echo $_SERVER['SCRIPT_NAME'];?>">
	<input type="text" name="name" />
	<input type="submit" value="search" />
</form>

<?php
	//DBに接続
	if (! $db = mysql_connect('localhost', 'sqltest', 'sqltest'))
	{
		echo 'CONNECT ERROR';
		exit;
	}
	mysql_select_db('sqltest', $db);

	mysql_query('SET NAMES SJIS');
//	mysql_set_charset('SJIS');

	//SQLを生成
	$name = mysql_real_escape_string($_REQUEST['name']);
	$sql = "SELECT * FROM user WHERE name='$name'";
	echo $sql . '<br />';

	//実行
	if (! $res = mysql_query($sql))
	{
		echo "QUERY ERROR <br />";
		echo mysql_error();
		exit;
	}

	echo "<pre>";
	while ($row = mysql_fetch_array($res)) {
		print_r($row);
	}
	echo "</pre>";
?>

</body>
</html>

CakePHPでDBのエンコーディングを指定

2010.02.16    CakePHP, PHP, 馬場   タグ: —    baba   

PHPでMySQL 5をUTF8にして使う場合、文字が全部????になってしまう問題を防ぐため、

default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake

を指定する、というのが定石になっています(よね?)。

しかし、共用サーバなどでmy.iniを編集できない場合、mysql_set_charset() などを使うと思います。

CakePHPでは、bootstrapでDB設定を読んで手動で設定するのも面倒だな、と思っていたら、さすがはCakePHP。便利な設定が。
app/config/database.php

var $default = array(
	'driver' => 'mysql',
	'persistent' => false,
	'host' => 'localhost',
	'login' => 'baba',
	'password' => 'hoge',
	'database' => 'testdb',
	'prefix' => '',
    'encoding' => 'utf8',
);

このようにencodingを指定するだけで、勝手にSET NAMESやmysql_set_charset()を実行してくれます。便利便利。

Ethnaコマンド

2010.02.15    Ethna, 馬場      baba   

WindowsのXAMPP環境でEthnaを使う際、Ethnaコマンドの設定でよく戸惑います。

プロジェクトの環境依存を減らすため、Ethna自体をプロジェクトのlibフォルダに入れるのが好きなのですが、そのような環境だと

  • add-project で Could not open input file: ~\Ethna\bin\\bin\ethna_handle.php となどのエラー
  • add-action で Fatal error: Could not redeclare class Ethna などのエラー

が出ることがあります。

私の使い方では、以下のような設定に落ち着きました。

共通の設定
phpにパスを通します。xampp/php のフォルダを環境変数のPATHで設定します。
ethna.bat があるフォルダにはパスを通さない方が良いです。

add-project をするとき
Ethnaをダウンロードして、workspaceに設置します。
workspace/Ethna/bin/ethna.bat を、workspaceにコピーします。

workspace/ethna.bat を開き、@PEAR-DIR@ を .\Ethna に一括置換します(2カ所)。

これで、コマンドプロンプトで、workspaceに入り、
C:\Users\baba\workspace > ethna add-project hoge
と実行できます。

add-action などをするとき
add-project 以外では、Ethnaのプロジェクトのディレクトリにいる必要があります。
hogeプロジェクトがある場合、workspace/hoge/lib フォルダに、Ethna(とSmarty)を設置しておきます。

workspace/hoge/lib/Ethna/bin/ethna.bat を、workspace/hoge にコピーします。
workspace/hoge/ethna.bat を開き、@PEAR-DIR@ を、 .\lib\Ethna に一括置換します(2カ所)。

これで、コマンドプロンプトでhogeディレクトリに入り、
C:\Users\baba\workspace\hoge > ethna add-action hoge_index
と実行できます。

以上で実行できますが、正直面倒なので、Eclipseプラグインを作ろうと思います。

ClickOnce

2010.02.14    Windows, 馬場      baba   

ClickOnceはMSI配布に比べていろいろな制限があります。

・ショートカットを自由に作成できない
・すべてのユーザに向けたインストールができない

しかし、一般ユーザ向けに配布するに当たり、自動アップデートの機能は魅力的ですね。

ClickOnceでちょっと困った点の解決方法をメモしておきます。

依存ファイルを一緒に配布する
依存するDLLなどの一緒に配布する必要がある場合、そのファイルをソリューションエクスプローラでプロジェクトに追加し、ビルドアクションを「コンテンツ」、出力ディレクトリを「常にコピーにする」に設定します。
これで、実行ファイルのディレクトリにファイルがコピーされます。

デスクトップにショートカットを作成する
無理なので、初回起動時にプログラムから作成するしかないようです。

何回もパブリッシュしているうちに、エラーが出て起動できなくなった
C:/Users/ユーザ名/AppData/Local/Apps/2.0 フォルダに実行ファイルの実体が保存されます。
これを削除すると、インストールできるようになりました。

古い投稿 »

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.