3流(技術屋 and 本読み) このページをアンテナに追加

本サイトでは2008-6-16よりGoogleAnalyticsによる解析を行っています。

2017-02-03

[]得意なことだけやらせよう 23:46 得意なことだけやらせよう - 3流(技術屋 and 本読み) を含むブックマーク 得意なことだけやらせよう - 3流(技術屋 and 本読み) のブックマークコメント

windowsで動作するツールをつくる時に、バイナリですべてつくるって方法もあるけれども、普通はスクリプトを作って、バイナリを利用するって形になる。

たとえば、簡単なツールの一例として、データベースから値を取ってくるバイナリアプリを、スクリプトから実行させて、とってきた値をバイナリアプリに渡すようなものは非常によく作られる。データベースからIPアドレスリストを取得して、取得したIPアドレスpingするなんてツールはよく作られているだろう。

んでもって、よく見かけるのは、そのスクリプトが苦手としている処理を無理やり作っちゃうパターンだ。

windowsで作るツールといえば、まず最古参なのがバッチだ。んでもって、バッチはその性質上、ファイルに記載された情報を使うのが苦手だ。また、コードの再利用を構造的に行うことも苦手だ。

windowsスクリプトや、powershellなら簡単に作れるのに、バッチで苦労して実装しているのを見ると、無駄なことやってんなーと思う。テキスト読んだり書いたりexcel操作するならvbsだし、まともな制御したいならpowershellだし、guiつかいたいならhtaもある。

バッチが苦手とする分野はバッチにやらせるべきじゃない。そこにこだわっちゃうと、作れるツールの上限が著しく下がっちゃうよ、と思うのであった。

まあ、結論としてはbashサイコーということだ。

2017-01-20

[]思いつきであって、できるかどうか不明です。 23:01 思いつきであって、できるかどうか不明です。 - 3流(技術屋 and 本読み) を含むブックマーク 思いつきであって、できるかどうか不明です。 - 3流(技術屋 and 本読み) のブックマークコメント

リモートデスクトップ接続したいPCで稀に「サービスがビジー」という状態ででアクセスできないときがある。

以下のコマンド群で治るかもしれない。

net use \\リモート先PC /user:管理者権限ユーザ パスワード
sc \\リモート先PC stop UmRdpService
sc \\リモート先PC stop TermService
sc \\リモート先PC start TermService

2行目のUmRdpServiceについては、TermServiceに依存するサービスなので、これ以外に依存サービスがあればSTOPしておく必要がある。

2015-12-15

[]プロキシの自動設定スクリプトの動作ではまったこと 13:29 プロキシの自動設定スクリプトの動作ではまったこと - 3流(技術屋 and 本読み) を含むブックマーク プロキシの自動設定スクリプトの動作ではまったこと - 3流(技術屋 and 本読み) のブックマークコメント

会社のインターネット接続環境は、プロキシ経由になっている。大小の様々なグループ会社が複雑に絡み合い今日も廻ってる*1感じのネットワークになっているので、イントラネットサイトとインターネットサイトへの接続時、どのプロキシを経由するのかは、会社公開の自動設定スクリプト(proxy.pac)によって判断されている。

自動設定スクリプトがどのようなものかは、以下参照。

https://technet.microsoft.com/ja-jp/library/cc985335.aspx

ある日、IE11で仕事上必要なwebサイトに接続しようとしたところ、プロキシに拒否された。理由はアップローダーだからとのこと。まあ、拒否された理由もわかるけど、閲覧が必要だったため、情報システム部に閲覧申請を行って、そのページが見られるようにプロキシを設定してもらった。

しかし、閲覧設定したにも関わらず、閲覧できるPCと閲覧できないPCが発生したのだった。PCの設定を見比べてみるも、IPアドレス以外に違いはない。ソースIPアドレスで制限をかけているのかと思ったが、ソースIPアドレスで制限かけているとのことで、それは比較したPCで同一だった。

ということで、自動設定スクリプトを読んでみることにした。スクリプトによれば、接続先がイントラネットなら、プロキシを通さずダイレクト接続*2。イントラネットでなければ、接続元のIPアドレスによって、プロキシサーバを変える*3という作りになっており、特に問題無さそうであった。

スクリプトが正しく動作しているのか確認するため、netstatコマンドで接続先のプロキシを確認したところ*4、明らかに「ソースIPアドレスから期待されるプロキシ」とは異なるプロキシに接続されている。つまり、この自動設定スクリプトは、接続元のIPアドレスとして、想定と異なるIPアドレスを使用しているということだろう。

ipconfigコマンドでIPアドレスを確認したところ、イントラネット接続のIPアドレスはネットワークの優先度が2番目であった。よって、優先度を1番目に変更した*5ところ、無事正しいプロキシに接続されるようになった。

f:id:marujx:20151215134306p:image

つまり、自動設定スクリプトのmyIpAdress関数は、実際にインターネット接続に使用しているIPアドレスではなく、ネットワーク優先度最上位のIPアドレスをソースアドレスと見なすということだろう。

いや、大変だった。

2015-12-07

[]IPアドレスリストからFTPGETするバッチ 13:49 IPアドレスリストからFTPGETするバッチ - 3流(技術屋 and 本読み) を含むブックマーク IPアドレスリストからFTPGETするバッチ - 3流(技術屋 and 本読み) のブックマークコメント

@echo off
setlocal enabledelayedexpansion

REM ////////////////////////////////////
REM 2015/12/7 marujx
REM ////////////////////////////////////

for /F "delims=." %%a in ('echo %DATE:/=%%TIME::=%') do SET today=%%a

REM IPアドレスリストファイル名を指定
set file_list=listfile.txt

REM 結果ファイル
set fname=%today%result.txt

REM FTP結果ファイル
set ftpfname=ftpresult.txt

REM FTPのスクリプトファイル
set ftpscript=ftpexec.ftp

REM カレントディレクトリ(取得先ディレクトリ 例:set CURDIR=maru)
set CURDIR=\

REM リモートディレクトリ(cd先 cdしない場合は. DATAへcdする場合は:set REMDIR=DATA)
set REMDIR=.

REM 送信ファイル
set DATAFILE1=nosleep.txt

REM アカウント
set USERNAME=Administrator
set PASSWORD=p@ssw0rd

REM 成功判定コード(FTPコード)
set SUCCESSCODE=^"226 "

 
FOR /F "delims=" %%a IN (%file_list%) DO (
	echo ------------------------------------------------------------->>%fname%
	echo 開始時刻:!date! !time!>>%fname%
	echo %%a へFTPを実施中・・・
	echo 対象アドレス:%%a>>%fname%
	REM -------------FTPスクリプトファイル書き込み------------------
	echo open %%a> %ftpscript%
	echo %USERNAME%>> %ftpscript%
	echo %PASSWORD%>> %ftpscript%
	echo bin>> %ftpscript%
	echo cd %REMDIR%>> %ftpscript%
	echo get %DATAFILE1% %%a_%DATAFILE1%>> %ftpscript%
	echo bye>> %ftpscript%
	REM -------------FTP実行-------------------
	ftp -s:%ftpscript% > %ftpfname% 2>&1
	type %ftpfname% >> %fname%
	find %SUCCESSCODE% %ftpfname% 
	if "!errorlevel!"=="0" (
		echo %%aからのファイル取得に成功しました
		echo %%aからのファイル取得に成功しました>>%fname%
	) else (
		echo %%aからのファイル取得に失敗しました
		echo %%aからのファイル取得に失敗しました>>%fname%
	)
	echo 終了時刻:!date! !time!>>%fname%
	echo ------------------------------------------------------------->>%fname%
	)
 
%fname%
 
Pause

2015-10-22

[]Windows7は東京オリンピックの夢を見るか 23:44 Windows7は東京オリンピックの夢を見るか - 3流(技術屋 and 本読み) を含むブックマーク Windows7は東京オリンピックの夢を見るか - 3流(技術屋 and 本読み) のブックマークコメント

あまり知られていないことだが、PCの法定耐用年数は4年だ。一般的に大企業では、機器の買い替えは償却期間に合わせていることが多い。だから、PCの購入サイクルは約4年となる。たとえば、いまPCを買い替えた場合、減価償却期間は2019年の10月くらいに終わりを迎え、次回の買い替えは同様に2019年の10月くらいとなる。

さて、Windows7が一般発売されてから今日でちょうど6年経過した。マイクロソフトはOSのライフサイクルを10年と定めている。新機能の追加を含めてすべてのサポートが行われる最初の5年間が「メインストリームサポート」、主にセキュリティパッチの提供が行われる後半5年間が「延長サポート」と呼ばれている。サポート期間を超えたOSは原則としてサポートされず、セキュリティパッチが提供されなくなることは、WindowsXPの終焉をもって、広く理解された。Windows7といえば既にメインストリームサポートが終了しており、今は「2020年1月」までの延長サポートが提供されている最中だ。

Windows7インストール済みとして購入したPCが、サポート期間内に減価償却期間を全うする条件は「来年の1月までに購入したPC」となる。つまり、2016/2以降に購入したWindows7のPCは「必ず減価償却期間中にOSのアップグレードが必要となる」ということだ。これは非常に大きな時間の無駄だろう。

だから、情報システム部門の方々は、次のPC買い替え時、Windows8.1もしくはWindows10を承認しなくちゃいけない。「社内システムの検証が終わっていないのでまだWindows8.1は使ってはいけません」とか「社内システムの検証が終わっていないのでまだWindows10は使ってはいけません」といった、ぬるいことを言ってられるのは、2016年の1月までだ。

以上、Windows7は少なくとも企業にとって「東京オリンピックを経験させてはいけない」OSですよ、XPで散々痛い目あって懲りたよね、というお話でした。



情報死捨て無の方々頑張ってください。


2015-08-30

[]Windowsで時刻を合わせるのは(案外)難しい 00:53 Windowsで時刻を合わせるのは(案外)難しい - 3流(技術屋 and 本読み) を含むブックマーク Windowsで時刻を合わせるのは(案外)難しい - 3流(技術屋 and 本読み) のブックマークコメント

時刻を合わせるっていうのはシステムにとって重要なことだけど、案外難しかったりする。特にWindowsでは無駄に複雑なのでちょっとだけまとめてみることにしてみた。

0.そもそも正しい時刻をどのように提供するか

インターネット上の時刻サーバ、GPS時刻サーバ、プロバイダ提供の時刻サーバ、データセンター提供の時刻サーバなどがある。これらのサーバのどれを正しい時刻とするか、まずは決定する。これはOSを問わず必要な作業だ。

1.ActiveDirectory環境

ドメインを構築している場合、Windowsの時刻はドメインコントローラと同期される。基本的にドメイン環境ではドメインコントローラの時刻の正確性だけ気にしておけばあまりトラブルになることはない。ただし、ドメインコントローラの時刻についてはきっちり正しい必要があって、それはNTPで確保するのが一般的。

2.ActiveDirectoryではない環境(WorkGroup環境)

ドメインを使用しない場合、時刻同期は非常に厄介になる。

2−1 NET TIMEコマンドを使用する

インターネットに直接接続できないような環境で時刻同期を行う場合、NET TIMEコマンドで時刻同期を行うことがある。

NET TIMEコマンドをタスクスケジューラや、ログオンスクリプトに仕込んでおくという方法が考えられるが、NET TIMEコマンドを使用すると、実行されるプロトコルはNTPではなくSMBが用いられる(SNTPを用いることもできる)。SMBにはユーザ認証が必要となっているので、NET USEで認証を通してからNET TIMEを実行する必要がある。また、SMBを使用するので、SMBをブロックするような設定をしているサーバや、SMBを提供していないサーバ、SMBを透過させない環境では有効な方法でない。

2−2 w32timeに頼る

w32timeサービスはWindowsの「日付と時刻の同期」に設定されているインターネット上の時刻サーバに、時刻を確認しに行く。使うプロトコルはNTPだ。だから、インターネットに時刻を同期しに行くのであれば、ルータやファイアウォールでNTPが通るようにしておく必要がある。また、同期がどのようなタイミングで行われるのか、確認する必要がある。

2−3 Hyper-V

何が厄介って、ドメイン環境でなく、インターネットに接続できない、Hyper-V環境の時刻同期くらい面倒なものはない。Hyper-Vの場合、バージョンによって「再起動時の管理OSとの時刻同期仕様が異なっている」からだ。

管理OSと同期をとらない設定の場合、Hyper-VのV2では再起動で同期されてしまい、V3では同期されない。基本的にHyper-V環境では管理OSも仮想OSも、時刻同期を個別に実施し、仮想OSが管理OSに同期されないように設定するのが良いように思われる。めんどくさいったらありゃしない。

2015-07-15

[]ネットワーク設定を採取してもらうバッチ 18:26 ネットワーク設定を採取してもらうバッチ - 3流(技術屋 and 本読み) を含むブックマーク ネットワーク設定を採取してもらうバッチ - 3流(技術屋 and 本読み) のブックマークコメント

ネットワークに問題が発生した場合に、Windowsですべての設定を採取してもらうためにバッチを作成してみた。

IPCONFIG、ROUTEPRINT、ARP、netstat、ネットワーク機能、ファイアウォールの設定を取得する。

Windows7以降なら動くはずだと思いたい。

@echo off
rem 2015/07/15 marujx
SET NetworkSetting=%COMPUTERNAME%_netset.txt
echo.
echo ネットワーク設定を一括で取得します。
echo.
pause

echo ###################IPCONFIG################### > %NetworkSetting%
echo. >> %NetworkSetting%
ipconfig /all >> %NetworkSetting%

echo. >> %NetworkSetting%
echo ###################ROUTE PRINT################### >> %NetworkSetting%
echo. >> %NetworkSetting%
route print -4 >> %NetworkSetting%

echo. >> %NetworkSetting%
echo ###################ARP################### >> %NetworkSetting%
echo. >> %NetworkSetting%
arp -a >> %NetworkSetting%

echo. >> %NetworkSetting%
echo ###################netstat################### >> %NetworkSetting%
echo. >> %NetworkSetting%
netstat -na >> %NetworkSetting%

echo. >> %NetworkSetting%
echo ###################netsh if show################### >> %NetworkSetting%
echo. >> %NetworkSetting%
netsh interface ipv4 show interfaces level=verbose >> %NetworkSetting%

echo. >> %NetworkSetting%
echo ###################firewall################### >> %NetworkSetting%
echo. >> %NetworkSetting%
netsh advfirewall firewall show rule name=all >> %NetworkSetting%

echo.
echo 取得しました。%NetworkSetting%ファイルを確認してください。
echo.
pause

2015-05-12

[]タブレットのbitlocker暗号化 10:40 タブレットのbitlocker暗号化 - 3流(技術屋 and 本読み) を含むブックマーク タブレットのbitlocker暗号化 - 3流(技術屋 and 本読み) のブックマークコメント

Windows8.1タブレットPCでbitlocker暗号化を行う際、パスワードで暗号化を解除する設定を行うと以下のエラー。

「このコンピューターは起動時BitLocker回復パスワードの入力をサポートしていません。BitLockerを使用できるようにWindows回復環境を構成する方法については管理者に問い合わせてください。」

これは、パスワード入力できることが保証されていないHW(タブレットPC)で発生することがある。HWキーボード接続の上、以下設定にて回避可能。

  1. Gpedit.msc実行
  2. [コンピュータの構成]−[管理用テンプレート]−[Windowsコンポーネント]−[bitlocker ドライブ暗号化]−[オペレーティングシステムのドライブ]−[スレートでプリブートキーボード入力が必要なBitlocker認証を使用できるようにする]を有効にする。

2015-03-02

[]AD環境で社員ID等から社員情報を取得するHTAツール 16:47 AD環境で社員ID等から社員情報を取得するHTAツール - 3流(技術屋 and 本読み) を含むブックマーク AD環境で社員ID等から社員情報を取得するHTAツール - 3流(技術屋 and 本読み) のブックマークコメント

社員IDから社員情報を解決する際に、AD(ActiveDirectory)から取ってくれば楽じゃんとおもいました。CUIなら簡単に作れるが、GUIで作るとなると結構厄介だ。しかしHTAという強い味方がWindowsにはいるのだ。

HTAはテキストベースなので、コンパイラがいらない。カスタマイズもテキストエディタさえあれば可能だ。

以下のコードのうち、「LDAPName」さえ変更すればそこそこ動くんじゃないだろうか。

<!---------------------------------------------------------------------------------->
<!--date		new/upd/del	author				comments	-->
<!--2015/02/27	新規作成	marujx							-->
<!--20XX/XX/XX										-->
<!---------------------------------------------------------------------------------->
<html><head>
<title>AD問い合わせツール</title></head>
<body>
<form name="formMain">
ADへの社員問い合わせを行います。<BR>
組み合わせ検索は行えません。複数条件を指定した場合、上の条件で検索されます。
    <p>
      <input type="button" value="問い合わせ実行" onClick="ADQuery()" />
    </p>
    社員ID<input type="text" name="ID" cols="16" value="" /><BR>
    備考<input type="text" name="Code" rows="25" value="" /><BR>
    社員名<input type="text" name="Name" rows="25" value="" /><BR><BR>
社員名   社員ID 備考   部署
<textarea name="Result" cols="80" rows="15">
</textarea>
</form>
<script language="VBScript">
Option Explicit

Sub Window_onLoad
	window.resizeTo 640,480
End Sub 

sub ADQuery()

Dim LDAPName
Dim baseDN, objRootDSE
Dim objConnection, objCommand, strCommandText
Dim objRecordSet, strUserDN

baseDN = ""

'LDAPサーバ名を記載
LDAPName = "LDAP://hoge.co.jp"

' ベースDNの取得
On Error Resume Next
Set objRootDSE = GetObject("LDAP://rootDSE")
If Err.Number <> 0 Then
  WScript.Echo "ドメイン接続に失敗しました。終了します。"
  WScript.Quit
Else
  baseDN = objRootDSE.Get("defaultNamingContext")
End If

msgbox baseDN
On Error Goto 0

' DCに接続して検索
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
objCommand.ActiveConnection = objConnection


Dim objADSystemInfo
Dim objUser
Dim Result

Dim Code
Dim id
Dim Name

If document.formMain.code.value<>"" then
    Code = document.formMain.code.value
    objCommand.CommandText = _ 
        "SELECT description,DisplayName,cn,Department FROM '" & LDAPName & "' WHERE Description='" & code & "'"   
ElseIF document.formMain.ID.value<>"" then
    id = document.formMain.ID.value
    objCommand.CommandText = _ 
        "SELECT description,DisplayName,cn,Department FROM '" & LDAPName & "' WHERE cn='" & id & "'"   
ElseIF document.formMain.Name.value<>"" then
    Name = document.formMain.Name.value
    objCommand.CommandText = _ 
        "SELECT description,DisplayName,cn,Department FROM '" & LDAPName & "' WHERE DisplayName='*" & Name & "*'"
Else
    Exit sub
End If

Set objRecordSet = objCommand.Execute 

Do 
    
    If (objRecordSet.EOF) Then
        Exit Do
    End If

    Dim vDescVal 
    Dim vDescVals 

    Result = Result & objRecordSet.Fields("DisplayName")
    Result = Result & "	" & objRecordSet.Fields("cn")
    Result = Result & "	"
    If Not IsNull(objRecordSet.Fields("description")) Then
        vDescVals = objRecordSet.Fields("description")
        For Each vDescVal In vDescVals
            Result=Result & vDescVal 
        Next
    End If
    Result = Result &  "	"  & objRecordSet.Fields("Department") & vbcrlf
    objRecordSet.MoveNext
    
Loop

document.formMain.Result.value=Result
Set objRecordSet = Nothing
Set objADSystemInfo = Nothing
End sub
</script>
</body></html>

2015-02-01

[]pukiwiki1.4.7をpukiwiki1.5に移行 19:11 pukiwiki1.4.7をpukiwiki1.5に移行 - 3流(技術屋 and 本読み) を含むブックマーク pukiwiki1.4.7をpukiwiki1.5に移行 - 3流(技術屋 and 本読み) のブックマークコメント

イントラネットで使用していたpukiwikiについて、WindowsServer2003が死亡する前に、2008以降の環境に移行させる。

新しい、pukiwikiは以下の構成で動作させる。

移行方法としては、以下のことを実施する。

  1. PHP5.5をインストール
  2. IISを有効化
  3. VC11再頒布パッケージをインストール
  4. pukiwiki1.5をサーバ上のどこかに展開。
  5. IISでPHPを実行可能にする。http://php.net/manual/ja/install.windows.iis7.php
  6. IISでpukiwiki1.5をサイトとして登録。index.phpを既定のドキュメントにする。
  7. pukiwiki1.5の「wiki」ディレクトリと「backup」ディレクトリに、既存の1.4系の「wiki」ディレクトリと「backup」ディレクトリの中身を上書きする。
  8. 1.4で使用していた「追加のplugin」を1.5環境にコピーする。
  9. 1.4で使用していた「編集されたlibディレクトリ以下のファイル」の変更点を1.5環境に記載する。
    ⇒尚、「notes://」でリンクしたい場合は、make_link.phpをhttpで検索し「https?|ftp|news」という記述を「https?|ftp|news|notes」に変更すればよい。
    ⇒「file://」でリンクしたい場合は、make_link.phpをhttpで検索し「https?|ftp|news」という記述を「https?|ftp|news|file」に変更すればよいが、360行付近の「mailto:)[\w\/\@\$()!?&%#:;.,~'=*+-]+」という記述は「mailto:)[\S\/\@\$()!?&%#:;.,~'=*+-]+」に変更する必要がある。