SQLの窓

2018年03月09日


Windows7 と Windows10 : MSG コマンドを使えるようにするには ( msg.exe )

職場と自宅と両方でテストしました。職場ではファイヤーウォールの設定が必要だったのですが、自宅では必要無いようでした。職場の PC は他にもセキュリティの設定が入っているので、それが影響しているかもしれません。ファイヤーウォール側の意味あいはイマイチ良く解ってませんが、もし 1722 となった場合は設定してみるとうまく行くかも解りません。

通常は、5 のエラーコードが返って来ますが、一番重要な AllowRemoteRPC を 1 にする設定がなされていなくても 5 のエラーコードが返ると思いますが、経験上 5 は資格情報のようなので、同一ユーザーで同一パスワードの場合は何も問題なく実行できると思います。

これは、net view コマンドも同様で、同一ユーザーで同一パスワードの場合は表示されると思います。別ユーザであったり、パスワードが異なる場合は、コントロールパネルの資格情報マネージャでその PC に向けての PC名、ユーザ、パスワードを記憶させておけば MSG も NET VIEW も使用可能でした。( 登録するユーザとして Adminstrator を使うと、User グループのユーザから、通常管理者ユーザへ送れました。ひょっとしたら、資格情報として登録する場合 Administrators グループなら良いのかもしれませんが、そこまでテストしていません。しかし、どうせ登録するのならば、Administrator のほうが管理しやすいでしょう。 )

Windows10 でコントロールパネルを表示するのは、ファイル名を指定して実行で、control と入力するといいと思います。( あるいは、デスクトップアイコンとしてコントロールパネルを表示するようにテーマの設定から行います )

ファイヤーウォールの設定

セッション名の取得エラー 1722 となりました。以下の設定を行って、AllowRemoteRPC を 1 にして、両方の PC に同一ユーザ名と同一パスワードで動作確認しました。( Windows7 => Windows10 と Windows10 => Windows7 )

とにかく設定変更したら再起動したほうが問題を排除しやすいと思います。(リモートアクセスで開いた側の PC から自分に送ったらリモートアクセス側に戻るという面白い現象も経験しました。)


( 全て有効にします )

C:\Users\lightbox>msg lightbox /server:pc-024 こんにちは
セッション名の取得エラー 5
セッション名の取得エラー 5 のエラーは、AllowRemoteRPC の設定と ユーザ・パスワードの不一致で起こると思われます

コントロールパネルの資格情報マネージャーで Windows 資格情報をあらかじめ登録しておくと利用できます。Adminstrator を登録しておくと他のユーザでも使えるようです( 何か他に条件があるのかもしれませんがテストした内容からするとそんな感じです )

環境によっては、pc 名では無く ipアドレスで直接指定するといいと思います。
メッセージを受けるほうの PC で、以下のレジストリ( AllowRemoteRPC )を 1 に変更します
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"AllowRemoteRPC"=dword:00000001

▼ デフォルトに戻す
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"AllowRemoteRPC"=dword:00000000


レジストリの位置を開くスクリプト
strParam = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server"

' レジストリ書き込み用
Set WshShell = CreateObject( "WScript.Shell" )
' WMI用
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

' レジストリエディタが最後に開いていたキーの登録を行います
strPath = "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey"
if GetOSVersion() >= 6 then
	strRegPath = "コンピューター\" & strParam
else
	strRegPath = "マイ コンピュータ\" & strParam
end if

' 既に regedit が実行中の場合はいったん終了させます
Set colProcessList = objWMIService.ExecQuery _ 
	("Select * from Win32_Process Where Name = 'regedit.exe'") 
For Each objProcess in colProcessList
	' 最後のウインドウの位置とサイズを保存する為の終わらせ方
	WshShell.AppActivate("レジストリ エディタ")
	Wscript.Sleep(500)
	WshShell.SendKeys ("%{F4}")
	Wscript.Sleep(500)
	' 上記終わらせ方が失敗した時の強制終了
	on error resume next
	objProcess.Terminate() 
	on error goto 0
Next 

WshShell.RegWrite "HKCU\" & strPath, strRegPath, "REG_SZ"

' レジストリエディタを起動します
Call WshShell.Run( "regedit.exe" )
' レジストリエディタが終わるまで待つ場合は以下のようにします
' Call WshShell.Run( "regedit.exe", , True )

REM **********************************************************
REM OS バージョンの取得
REM **********************************************************
Function GetOSVersion()

	Dim colTarget,str,aData,I,nTarget

	Set colTarget = objWMIService.ExecQuery( _
		 "select Version from Win32_OperatingSystem" _
	)
	For Each objRow in colTarget
		str = objRow.Version
	Next

	aData = Split( str, "." )
	For I = 0 to Ubound( aData )
		if I > 1 then
			Exit For
		end if
		if I > 0 then
			nTarget = nTarget & "."
		end if
		nTarget = nTarget & aData(I)
	Next

	GetOSVersion = CDbl( nTarget )

End Function

MSG コマンドの引数

MSG {ユーザー名 | セッション名 | セッション ID | @ファイル名 | *}
    [/SERVER:サーバー名] [/TIME:秒] [/V] [/W] [メッセージ]

  ユーザー名          送信先のユーザー名を指定します。
  セッション名        セッション名を指定します。
  セッションID        セッション ID を指定します。
  @ファイル名         メッセージの送信先一覧のファイル (ユーザー名、
                      セッション名、セッション ID) を指定します。
  *                   指定されたサーバーのすべてのセッションにメッセージを
                      送信します。
  /SERVER:サーバー名  送信先のサーバーを指定します (既定値は現在のサーバー)。
  /TIME:秒            受信者の確認応答までの待ち時間を指定します。
  /V                  実行中に詳細情報を表示します。
  /W                  ユーザーからの応答を待ちます。通常 /V オプションと共に
                      指定します。
  メッセージ          送信するメッセージを指定します。指定しない場合は、入力
                      プロンプトが表示されるか、または stdin から読み取ります。
posted by lightbox at 2018-03-09 18:13 | Windows | このブログの読者になる | 更新情報をチェックする

JavaScript の論理和(||) による『無かった場合の値の代入』/ expr1 || expr2 は expr1 を false と見ることができる場合は expr2 を返します

タイトルのまんまですが、MDN の 『式と演算子』のページに記述されています。

以下は jQuery で取得した文字列値に trim を実行して、空文字列だったら 0 をセットするという処理です。
var value = $("#target").val().trim() || 0;

また、値の変わりに実行文を記述する事もできるので、関数にすれば戻り値がセットされます。
function myfunc ( txt ) {
	console.log( txt );
	return "未定義";
}
var value = $("#target").val().trim() || myfunc("ここが実行される");



$("#target") の値が未入力または空白の場合、myfunc の引数がデベロッパーツールのコンソールに表示されて、value には "未定義" がセットされます



posted by lightbox at 2018-03-09 14:07 | JavaScript | このブログの読者になる | 更新情報をチェックする

2018年03月08日


Excel で 角丸四角形や1つの角を切り取った四角形で、角丸や切り取った長さを一定に設定する為の VBA Sub プロシージャ

インターネットで探していたら、『角丸四角形シェイプのコーナーRをミリ指定する』というコードを見つけたんですが、もっと簡素化できるので。

Sub adjust_box()
 
    Dim target As Shape
     
    For Each target In Selection.ShapeRange
    
        target.Adjustments.Item(1) = 10 / target.Height
        
    Next
 
End Sub
10 の部分を適当に変更すればいいと思います。登録場所は ThisWorkbook で、オブジェクトと選択の表示で対象オブジェクトを CTRLキーを押しながら複数選択して、Alt+F8 でマクロダイアログを表示して Enter で。

Adjustments.Item プロパティ (Excel) によると、『引数 Index で指定された調整値を取得または設定』だそうで、マクロの記録を使って動かしてみると、Adjustments.Item(1) にデータがセットされていました。

※ Sub プロシージャ は値を返しません



posted by lightbox at 2018-03-08 15:24 | VBA | このブログの読者になる | 更新情報をチェックする

2018年03月07日


バッチファイル内で、コマンドプロンプトが管理者権限で実行されているかのチェック

Windows10用WinHlp32.exeインストールバッチファイル というものを見つけて、Windows10 で実行してうまく行ったので、バッチファイルを読んでみたら面白い処理があったので、環境変数を使わないパターンで整理してみました。

@echo off

:check1
for /f "tokens=1 delims=," %%i in ('whoami /groups /FO CSV /NH') do (
	if "%%~i"=="BUILTIN\Administrators" goto :check2
)

echo 管理者グループではありません
goto :end

:check2
for /f "tokens=1 delims=," %%i in ('whoami /groups /FO CSV /NH') do (
	if "%%~i"=="Mandatory Label\High Mandatory Level" goto :admin
)
echo 管理者権限で実行してください
goto :end

:admin

echo 管理者権限で実行しています

:end

/f はファイルを読み込んだりするスイッチですが、コマンドの実行結果も使えるので、ここでのコマンドは whoami です。

引数の /groups /FO CSV /NH は、実行中のユーザが属するグループの一覧を CSV 形式で タイトルヘッダー無しで表示という意味です。

"tokens=1 delims=," は、CSV 形式なので、カンマで分解して先頭の文字列を使うという意味で、結果が %%~i に入るので文字列としてチェックする為に " で挟んで右辺と比較しています。

二つの条件を両方満たしたら、管理者グルーブのユーザが管理者権限で実行している事になります。 

管理者権限のチェックはそれほど重要ではありませんが、バッチファイルでどうしてもいろいろ分岐したい場合に使われるテクニックで、コマンドの結果で判断できるので、レジストリの内容を REG QUERY で取り出して利用も可能です。


※ 管理者権限でないと、High Mandatory Level では無く、Medium Mandatory Level でした。


posted by lightbox at 2018-03-07 17:27 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2018年03月01日


Windows でパスワードを忘れた場合はインストールディスクがあれば簡単に復旧できるのは解った。

こういうシチュエーションに遭遇するのはどちらかと言うと不幸なので微妙な気持ちですが、やり方としてはそれなりの経験のある技術者が真剣に対処すれば思い付きそうな内容なので、何だか身近に感じてしまいました。

インストールディスク

これが無いと、Microsoft からダウンロードしてディスク作成しないといけないので面倒ですが、会社組織なら比較的ありそうな気もします。個人の場合は、知り合いに電話しまくって手に入れるとか方法はあると思います。

インストールが目的では無く、インストールの開始ダイアログが表示された状態で、Shift + F10 でコマンドプロンプトが表示されます。これを知ってる時点で技術者であれば、ほぼ問題は解決したようなものです。(自分は知らなかったですけれど)

知っておく必要があるのは、コマンドプロンプトが x ドライブになってたという事。それで、c ドライブを探したら、何故か作業した環境では e ドライブでした。x 内にも windows フォルダがありますが、その中の system32 には、utilman.exe は居ないです。...なんか意図を感じますよね。

utilman.exe のおかげ

Microsoft がこんな時の為に用意した穴だとさえ思える仕様です。ログイン画面で左下のアイコンをクリックすると、このアプリケーションが起動します。しかも、管理者権限(?)で起動するところが素敵です。なので、utilman.exe の代りに、cmd.exe を utilman.exe という名前で置いておけば、もう後は net user ユーザ名 パスワード でパスワードをリセットできます。これができれば、後の作業は他人にまかせてもいいぐらいの平常運転になるわけです。

この一連の処理は、インターネットで探せばイヤと言うほど出て来ます。ここまで読んで理解してしまった人ならわざわざ探さなくても何をどうすればいいかは自明の理ですが。

注意するのは、たいていにおいて対象が自分では無い事

要するに、Administrator が有効になって無い事が多々あります(こういう事が起きる PC なので)。なので、その場合は、net user ユーザ名 パスワード /active:yes で有効にしてかつパスワードリセットです。

ここまで終わると、ログインからすぐ administrator からログインできます。utilman.exe を元に戻す場合は、コマンドプロンプトを管理者権限で開いて作業します。

簡単な管理者権限の cmd.exe の開け方は、いったん cmd.exe 実行しておいて、タスクバーの cmd.exe を CTRL+SHIFT+クリックです。


おまけ : 別ユーザに元ユーザの Thunderbird 復旧

profiles.ini と C:\Users\<username>\AppData\Roaming\Thunderbird\Profiles\xxxxxxxx.default\ フォルダを新しいユーザのほうにコピーして復旧しました。

このトラブルで過去の問題が再燃

Access から SQLServer 認証の ODBC DSN で接続しているのに、Windows 認証で勝手に接続しようとして失敗するトラブルの解決方法



posted by lightbox at 2018-03-01 16:14 | Windows | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり