PowerShellを便利に使う

2010.03.09    Windows, 馬場      baba   

Windows Vista以降では、PowerShellが標準搭載されています。

慣れてくると、コマンドプロンプトよりもPowerShellの方がいろいろ便利です。とりあえず、うっかりlsと打っても大丈夫なのが一番重要。

ただし、起動手順は
・コマンドプロンプト: Windows + R → cmd
・PowerShell: Windows + R → powershell
このように、powershellと打ち込むのがめんどくさいですね。

そこで、ファイル名を指定して実行のショートカットに追加してしまいましょう。

C:/Users/baba/shortcuts などのフォルダを作り、その中にPowerShellへのショートカット「ps」という名前で作ります。
ps → C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe

後は、環境変数のPATHにC:/Users/baba/shortcuts を追加すればOKです。

環境変数のPATHを設定

環境変数のPATHを設定

これで、Windows + R → ps でPowerShellが開くため、コマンドプロンプトを使う機会が減りそうです。
ショートカットを作成する際、作業フォルダを指定できるのもポイントですね。

もちろん、PowerShell以外にもショートカットおき放題なので、ランチャーいらずです。

いろいろなバージョン取得

2010.03.07    C#, Windows, 馬場   タグ: —    baba   

バージョン情報と一口にいっても、実行ファイルのバージョン、DLLのバージョン、ClickOnceやインストーラのバージョンなど様々です。

バージョン情報ダイアログを作るために、これらのバージョンの取得方法を書いてみます。といってもコードで。

/// <summary>
/// ClickOnceで設定されたバージョンを取得
/// </summary>
public static Version ClickOnceVersion
{
	if (!System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
	{
		return null;
	}
	return System.Deployment.Application.ApplicationDeployment
		.CurrentDeployment.CurrentVersion;
}

/// <summary>
/// 実行中のexeファイルのバージョンを取得
/// </summary>
public static string AssemblyVersion
{
	return System.Windows.Forms.Application.ProductVersion;
}

/// <summary>
/// 実行中のexeファイルと同一ディレクトリにあるDLLの情報を取得
/// </summary>
public static List<System.Diagnostics.FileVersionInfo> DllVersion
{
	var versions = new List<System.Diagnostics.FileVersionInfo>();

	//自身のファイルパスを取得し、同一ディレクトリのdllファイルを一覧する
	string path = System.IO.Path.GetDirectoryName(
		System.Windows.Forms.Application.ExecutablePath);
	foreach (string name in System.IO.Directory.GetFiles(path, "*.dll"))
	{
		System.Diagnostics.FileVersionInfo info =
			System.Diagnostics.FileVersionInfo.GetVersionInfo(name);
		versions.Add(info);
	}

	return versions;
}

このような感じで、バージョン情報ダイアログが作れそうです。
※DLLのバージョン取得はもう少し工夫しないと問題がありそうですが・・・

ApplicationDeployment

2010.03.06    C#, Windows, 馬場   タグ: —    baba   

C#等のアプリで、自身がClickOnceでインストール・実行されているかをチェックするには、

System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed

を調べます。

しかしこのプロパティ、普通に起動するとfalseが取得できますが、Visual Studioから起動するとなぜかフリーズすることがあります。ありました。

この場合は、ClickOnceアプリの実体が保存される C:/Users/ユーザ名/AppData/Local/Apps/2.0 を削除して、コンピュータを再起動すると直るようです。直りました。

起動プロセスが複雑になるとたまに面倒ですね。

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 を実行するか再起動しておく必要があります。

ウィンドウを背後に移動

2010.02.25    C++, Windows, 馬場      baba   

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

WinBottom

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

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

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

ClickOnce

2010.02.14    Windows, 馬場      baba   

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

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

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

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

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

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

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

ActiveDirectory環境下でローカルユーザを追加

WindowsをActiveDirectoryに参加させると、コントロールパネルの「ユーザアカウント」が変わります。

ActiveDirectoryのユーザを追加する際は、サーバ上で設定すれば良いのですが、各PCのローカルユーザを追加するときにちょっと戸惑います。

ダメなパターン
「ユーザアカウント」を開くと、「追加」ボタンがあるので、それを押してみると・・・

ユーザアカウント一覧画面

ユーザアカウント一覧画面

追加

追加

権限の設定

権限の設定

完了を押すと・・・

完了を押すと・・・

このように、エラーになってしまいます。
この画面は、既に存在するユーザにグループを設定することは出来ますが、新規ユーザの作成ができません。

正しいやり方
「ユーザアカウント」の「詳細設定」タブで、「ユーザ管理の詳細設定」を開きます。

詳細設定を選択

詳細設定を選択

出てきた画面で、右クリックして「新しいユーザー」をクリックします。

新しいユーザの追加

新しいユーザの追加

ダイアログにユーザ情報を入力すれば、ユーザが追加できます。
「作成」をクリックしても何もおきないように見えますが、連続追加出来るように画面が閉じないだけで、ちゃんと追加されています。

ユーザ情報の入力

ユーザ情報の入力

これで、ローカルユーザが追加出来ました。もちろん、管理者権限のあるアカウントでログインしていることが必要です。

わかりにくいですね。

HDDエラー(chkdskすれば直ります)

2010.02.04    Windows, 馬場   タグ: , —    baba   

どっちだよ!って思いますよね。ふつう。

問題が発見されま...

問題が発見されま...

ここで
・日本語
・Windows
・フォント
どれの責任と思うかで、性格診断ができます。

Windows 7 アップグレードインストールのプロダクトキー

2010.01.27    Windows, 馬場      baba   

Windows 7 アップグレード版をインストールする際、すでにHDDにWindowsが入っている場合、アップグレードインストールでも新規インストールでも問題なく行えます。

しかし、HDDを交換した場合など、Windowsが入ったHDDが接続されていない場合、プロダクトキー入力のところで弾かれます。

「プロダクトキーが有効ではありません」と表示される

「プロダクトキーが有効ではありません」と表示される

Windows 7では、通常版とアップグレード版でプロダクトキーが分かれており、アップグレード版の場合は、インストール時に既に何らかのWindowsがHDD内に存在することが条件になっています。
ライセンス上、古いWindowsの正規ライセンスを保持していれば問題ないはずなので、若干不親切な仕様ですね。

逆に、入っているWindowsがライセンスを持っているかどうかは判定されないので、いったんプロダクトキーを空で入力して、その後アップグレードインストールし直せば、プロダクトキーは受理されます。もちろん、正規ライセンスを持っている状態でやってください。

・・・とここまで書いて気がついたんですが、Vistaの時も全く同じことやっていましたね。

せめて、エラーメッセージを「このプロダクトキーでは新規インストールできません」としてくれると、混乱を減らせると思うんですが。

古い投稿 »

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