2016年2月12日金曜日

リモートデスクトップログアウト時にデスクトップを表示

windows8.1
リモートデスクトップを閉じた際に、サーバ側の PC がログオン画面のままになるのを回避する場合以下のコマンドが有効
tscon.exe RDP-Tcp#0 /dest:console
batファイルとして作成して、りモートデスクトップ終了時に管理者で実行するとログオフしリモートされたPCはデスクトップを表示するはずであった。
しかし、何度もは入ったり出たりすると#0の部分が#1,#2と変わってしまうので作動しなくなる結果に。

それで動的にヒットするまで処理を回したらどうだということで以下のコマンドを走らせてみた


for /L %%e in (1,1,100) do tscon.exe RDP-Tcp#%%e /dest:console


とりあえず1~100まで処理をすれと

そうすることで安定してログアウトが可能になった。

100を超えるくらい出たり入ったりするならばパラメータを変更すれば良い


あまり美しくは無いがまずは良しとしよう

2016年2月9日火曜日

タスクスケジューラに登録したバッチファイルが動かない

バッチファイルが動かない!のをなんとかする方法
要するに作業ディレクトリを設定しないといけないようです、上の画像は作業ディレクトリを設定する画面
タスクのプロパティ⇒操作タブ⇒操作の編集⇒開始(オプション)(T)に作業ディレクトリを指定してやれば良いみたいです、このパラメータを入れなかったので「パラメータが不適切」だと怒られたのですね。
この場合だと 開始(オプション)(T) に作業ディレクトリ(実行するプログラムが入っているフォルダ)を指定するので。
d:\wwwroot\awstats\cgi-bin\ と入力してやればOKです。
また別の方法もあるようで、バッチファイルに作業ディレクトリを指定してもよいみたいですのでこの方法で行います。



バッチファイルに赤文字部分を追加
cd /D %~dp0
cd “d:\wwwroot\awstats\cgi-bin”
awstats.pl -config=awstats.conf -update
cd コマンドの 「/D オプションは ドライブ及びディレクトリをパラメータで指定した場所に移動」するものです、「%~dp0 とは実行されているファイルが置かれているカレントディレクトリ」の事です、つまりバッチファイルを実行している場所にドライブとディレクトリを移動すると言う意味だそうで、上記のタスク設定画面に入力するのと同じ事のようです。


2015年1月9日金曜日

KEYENCEハンディでプログラム開発 マイクロソフトACCESSを使う

KEYENCE(キーエンス)ハンディのプログラム開発で
マイクロソフトのACCESSを使用したスキャン検品システムを構築
特殊な開発ツールは全く必要なく出来あがりました。

応用するとエクセルのVBAでもおそらく可能です。
しいて言えば、音の制御はVBを使用するスキルは必要になります。

この環境で運用するにはある程度条件が必要になります

1)1秒間に3~4回以上の速さを求めるスキャニングには適さない
2)リモートデスクトップを使用するので、台数が多くなると管理が難しい
3)BEEP音の制御はVBも同時に制御する必要がある
4)無線LAN設備と配置問題(ローミング設定は比較的容易)

以上の条件を考えるとやはり大規模向けには少し問題があると感じます。
小規模で1)のような速さが必要なければ導入コストが通常の場合と比較にならないくらい格段に下がりますので導入検討の余地は十分にあると思います。

MSACCESS開発をしているところであれば容易に作成可能です

具体的な導入方法はまた後で紹介したいと思います。







2014年12月26日金曜日

ACCESSからVB.netへ 文字を送信

ACCESSから起動できないプログラムでVBからは起動できる
そんな場合にACCESSからパラメータとして文字送信をし
VBで受け取りその内容に応じて処理を行う
windows32 APIを利用 SendMessage

送信側  (ACCESS)

Option Compare Database
Option Explicit

'ウィンドウハンドル取得
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'子ウィンドウハンドル取得
Private Declare Function FindWindowExA Lib "user32" _
    (ByVal hpar As Long, ByVal hchi As Long, ByVal cnm As String, ByVal cap As String) As Long
'メッセージ送信
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Const WM_COPYDATA = &H4A
Private Type COPYDATASTRUCT
    dwData As Long
    cbData As Long
    lpData As String
End Type


Function strSend()
    Dim hWnd As Long
    Dim sdtCOPYDATASTRUCT As COPYDATASTRUCT
    Dim txtSendData As String
    txtSendData = "ABCDEFG"

    Dim Ret As Long
    '送信データ格納
    sdtCOPYDATASTRUCT.dwData = 0
    sdtCOPYDATASTRUCT.cbData = LenB(txtSendData) + 1
    If Nz(txtSendData, "") = "" Then
        sdtCOPYDATASTRUCT.lpData = vbNullChar
    Else
        sdtCOPYDATASTRUCT.lpData = txtSendData  '送信データ
    End If
    '受信側のウィンドウハンドル取得
    hWnd = FindWindow(vbNullString, "フォーム名")

    If hWnd <> 0 Then
        Call SendMessage(hWnd, WM_COPYDATA, 0, sdtCOPYDATASTRUCT)
    End If

End Function


受信側  VB.NET

 'COPYDATASTRUCT構造体
    Public Structure COPYDATASTRUCT
        Public dwData As IntPtr   '送信する32ビット値
        Public cbData As Int32        'lpDataのバイト数
        Public lpData As String     '送信するデータへのポインタ(0も可能)
    End Structure
    Public Const WM_COPYDATA As Int32 = &H4A
    Public Const WM_USER As Int32 = &H400
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_USER
                '数値が送信されて来た
                TextBox1.Text = m.WParam.ToString()
                'txtInt2.Text = m.LParam.ToString()
            Case WM_COPYDATA
                '文字が送信されて来た
                Dim mystr As COPYDATASTRUCT = New COPYDATASTRUCT()
                Dim mytype As Type = mystr.GetType()
                mystr = CType(m.GetLParam(mytype), COPYDATASTRUCT)
                TextBox1.Text = mystr.lpData
        End Select
        MyBase.WndProc(m)
    End Sub

Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
’TextChangedイベントトラップを使って処理を実行
MessageBox.Show(Me.TextBox1.Text)

Me.TextBox1.Text = " "
End Sub

VBでしか動かせないものがある場合に使用出来ます。
VBフォームを予めOpenしておかなければならない点が我慢できるのであれば
選択肢として使えるのではないかと思います。

2013年7月18日木曜日

完全バックアップを別データベースに復元する方法

1.SQLServer Management Studio を起動


2.「データベース」を右クリックして、「新しいデータベース」を作成

3.「データベース」を右クリックして、「データベースの復元」をクリック

4.「全般」タブの復元先→復元先データベースに上で新規作成したデータベースを選択

5.「 復元用のソース」で「デバイスから」をチェックし、完全バックアップファイルを指定

6.[オプション]タブで「既存のデータベースを上書きする」をチェック

7.[OK]

8.完了

■注意1



「オプション」タブの「既存のデータベースを上書きする」のチェックを行いわないと



バックアップ セットは、既存のデータベース ‘%ls’ 以外のデータ

ベースのバックアップを保持しています。

といったエラーメッセージが表示される



■注意2



「オプション」タブの「次のデータベースファイルに復元」で



•databasename.mdf

•databasename_log.ldf

ともに、新しく作成したDBのものを参照していることを確認。間違ったパスを参照していると



サーバー’サーバ名’の復元に失敗しました。(Microsoft.SqlServer.Smo)

追加情報:



System.Data.SqlClient.SqlError:オペレーティング システム エラー3(指定されたパスが見つかりません)により、ファイル”mdf ファイルへのパス”のディレクトリ参照に失敗しました。(Microsoft.SqlServer.Smo)

といったメッセージが表示される。



MVNOでスマートフォン運用

現在ServersMan SIM 3G 100で約半年運用

かなり使い方に限定があるのだけれども、月額の費用からすると
それなりだと思う。


2012年3月8日木曜日

メモリ上のゴミ掃除アプリ empty.exe

動作が遅くなった場合に有効なアプリ empty.exe

入手方法

「Windows Server 2003 Resource Kit Tools」
これをダウンドーロ

ファイル名 
「rktools.exe」をダウンロードし解凍する

その中の
rktools.msiをインストール

インストールされる場所だが32ビット版と64ビット版で以下のようになる。
32ビット版の場合:C:\Program Files\Windows Resource Kits\Tools\

64ビット版の場合:C:\Program Files (x86)\Windows Resource Kits\Tools\

■「empty.exe」をsystem32フォルダにコピーする

メモ帳を使ってバッチファイルを作成する

@echo
offempty.exe *

を入力

拡張子.batで登録完了