Windows XP で、暗号化されたファイルをまとめて暗号解除する方法

Windows XP で、ディレクトリを暗号化することを考える。暗号化自体は簡単だ。暗号化したいディレクトリのプロパティから暗号オプションをオンにするだけで、その配下のサブディレクトリもしくはその中にあるすべてのファイルを暗号化できる。暗号化されたファイルは緑色で表示される。わかりやすい。

Windows XP で、ディレクトリを暗号化することを考える。暗号化自体は簡単だ。暗号化したいディレクトリのプロパティから暗号オプションをオンにするだけで、その配下のサブディレクトリもしくはその中にあるすべてのファイルを暗号化できる。暗号化されたファイルは緑色で表示される。わかりやすい。

Windows で、プロセス一覧をコマンドラインから表示させる方法

コマンドプロンプトを起動して、単純に tasklist と入力する。
コマンドプロンプトを起動して、単純に tasklist と入力する。

Windows で、svchost.exe が何を実行しているかタスクリストを調べる方法

タスクマネージャでプロセス一覧を見れば、svchost.exe というのが複数起動していることに気づくはずだ。ではいったい svchost.exe って何なんだ?その答えは、以下のコマンドプロンプトから以下のコマンドを実行してみて欲しい。 C:\>tasklist /fi "imagename eq svchost.exe" /svc
タスクマネージャでプロセス一覧を見れば、svchost.exe というのが複数起動していることに気づくはずだ。ではいったい svchost.exe って何なんだ?その答えは、以下のコマンドプロンプトから以下のコマンドを実行してみて欲しい。 C:\>tasklist /fi "imagename eq svchost.exe" /svc

Outlook 2003 で、自動的に bcc に送るには?

Outlook 2003 で、自動的に bcc を送るには、以下のコードをメニュー|ツール|マクロ|Visual Basic Editor (ALT+F11)のプロジェクトエクスプローラの中で、Project → Microsoft Office Outlook Objects → ThisOutlookSession のウィンドウに貼り付ける。青字の部分は、bcc に送るメールアドレスを記入する。Outlook のマクロ実行のセキュリティは、ツール→マクロ→セキュリティのところを、「中」にしておかけねばならない。こうすると Outlook を起動するごとにマクロを有効にするかどうかのダイアログボックスが出るが、仕方がない。 以下のコードは、「 in Microsoft Outlook 2000 or later versions">To automatically add an e-mail address as a Bcc to all outgoing messages in Microsoft Outlook 2000 or later versions」 より無断転載。 さて、bcc に送るというのは、どういうことを意味するのだろうか?現在では、GMail に代表されるように、無料の大容量オンラインメールサービスが提供されている。GMail にアカウントを作り、自分の送るすべてのメールを bcc で GMail に送っておけば、バックアップのみならず、何かトラブルに巻き込まれたときに第三者が受け取ったメールとして GMail 内に保存される。証拠はできるだけ残しておくべきなのだ。 ちなみに、GMail の場合は、メールアドレスの「@」の前のアカウント名の部分に「+」や「.(ピリオド)」といった記号を使えることをご存知だろうか?たとえば perltips@gmail.com というアドレス名であれば、bcc 先のアドレスを perltips+bcc@gmail.com としても、GMail 側では perltips@gmail.com として処理されるのだ。もちろんこのアドレスにフィルタをかけることもできる。ピリオドについては無視される。アカウント名の部分のどの文字と文字の間にもピリオドを置くことができる。
Outlook 2003 で、自動的に bcc を送るには、以下のコードをメニュー|ツール|マクロ|Visual Basic Editor (ALT+F11)のプロジェクトエクスプローラの中で、Project → Microsoft Office Outlook Objects → ThisOutlookSession のウィンドウに貼り付ける。青字の部分は、bcc に送るメールアドレスを記入する。Outlook のマクロ実行のセキュリティは、ツール→マクロ→セキュリティのところを、「中」にしておかけねばならない。こうすると Outlook を起動するごとにマクロを有効にするかどうかのダイアログボックスが出るが、仕方がない。 以下のコードは、「 in Microsoft Outlook 2000 or later versions">To automatically add an e-mail address as a Bcc to all outgoing messages in Microsoft Outlook 2000 or later versions」 より無断転載。 さて、bcc に送るというのは、どういうことを意味するのだろうか?現在では、GMail に代表されるように、無料の大容量オンラインメールサービスが提供されている。GMail にアカウントを作り、自分の送るすべてのメールを bcc で GMail に送っておけば、バックアップのみならず、何かトラブルに巻き込まれたときに第三者が受け取ったメールとして GMail 内に保存される。証拠はできるだけ残しておくべきなのだ。 ちなみに、GMail の場合は、メールアドレスの「@」の前のアカウント名の部分に「+」や「.(ピリオド)」といった記号を使えることをご存知だろうか?たとえば perltips@gmail.com というアドレス名であれば、bcc 先のアドレスを perltips+bcc@gmail.com としても、GMail 側では perltips@gmail.com として処理されるのだ。もちろんこのアドレスにフィルタをかけることもできる。ピリオドについては無視される。アカウント名の部分のどの文字と文字の間にもピリオドを置くことができる。

Visual C++ (Win32) で、SHA1 のハッシュ値を取得する方法

以下がサンプルコード。Win32 Crypto API を使うコンソールアプリです。
// HashTest.cpp : Defines the entry point for the console application.
// Copyright (c) 2005, 2006 twinkle.cc All Rights Reserved.
//
//" title="http://perltips.twinkle.cc/
//">http://perltips.twinkle.cc/
//
perltips@gmail.com

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>

int _tmain(int argc, _TCHAR* argv[])
{
    #define BUFFER_LEN 253
    #define SHA1LEN  20

    PCHAR    pcMessage;
    DWORD    ccMessage;

    DWORD dwStatus = 0;
    HCRYPTPROV hProv = 0;
    HCRYPTHASH hHash = 0;
    BYTE pbHash[SHA1LEN];
    BYTE pbRandom[BUFFER_LEN];
    DWORD cbHash = 0;
    CHAR pcDigits[] = "0123456789ABCDEF";
    CHAR pcHash[SHA1LEN * 2 + 1];

    //Get handle to the crypto provider
    if (!CryptAcquireContext(&hProv,
        NULL,
        NULL,
        PROV_RSA_FULL,
        CRYPT_VERIFYCONTEXT))
    {
        dwStatus = GetLastError();
        goto done;
    }

    // Get a random value
    if( CryptGenRandom(
        hProv,
        BUFFER_LEN,
        pbRandom))
    {
        printf("%d bytes of random data have been generated.\n", BUFFER_LEN);
    }
    else
    {
        dwStatus = GetLastError();
        printf("Random bytes were not correctly generated.\n");
        goto done;
    }
   
    if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
    {
        dwStatus = GetLastError();
        goto done;
    }
   
    if (!CryptHashData(hHash, pbRandom, BUFFER_LEN, 0))
    {
        dwStatus = GetLastError();
        printf("CryptHashData failed: %d\n", dwStatus);
        goto done;
    }

    cbHash = SHA1LEN;
    if (CryptGetHashParam(hHash, HP_HASHVAL, pbHash, &cbHash, 0))
    {
        printf("SHA1 hash is: ");
        for (DWORD i = 0; i < cbHash; i++)
        {
            pcHash[i * 2]      = pcDigits[pbHash[i] >> 4];
            pcHash[i * 2 + 1 ] = pcDigits[pbHash[i] & 0xf];
            pcHash[i * 2 + 2 ] = '\0';
        }
        printf("%s\n", pcHash);
    }
    else
    {
        dwStatus = GetLastError();
        printf("CryptGetHashParam failed: %d\n", dwStatus);
    }

    done:

    CryptDestroyHash(hHash);
    CryptReleaseContext(hProv, 0);

    WCHAR pwcMessage[BUFFER_LEN];
    MultiByteToWideChar(CP_ACP, 0, pcHash, sizeof(pcHash), pwcMessage, sizeof(pwcMessage));
  
    ccMessage = ( DWORD ) wcslen( pwcMessage );

    if( ( pcMessage = ( PCHAR ) malloc( ccMessage + 1 ) ) )
    {
        WideCharToMultiByte( CP_ACP, 0, pwcMessage, -1, pcMessage, ccMessage + 1, NULL, NULL );
        printf("malloc ok: %s\n", pcMessage);
    }
    else
    {
        printf("Not enough memory");
        dwStatus = ERROR_NOT_ENOUGH_MEMORY;
    }

    return dwStatus;
}
以下がサンプルコード。Win32 Crypto API を使うコンソールアプリです。
// HashTest.cpp : Defines the entry point for the console application.
// Copyright (c) 2005, 2006 twinkle.cc All Rights Reserved.
//
//" title="http://perltips.twinkle.cc/
//">http://perltips.twinkle.cc/
//
perltips@gmail.com

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>

int _tmain(int argc, _TCHAR* argv[])
{
    #define BUFFER_LEN 253
    #define SHA1LEN  20

    PCHAR    pcMessage;
    DWORD    ccMessage;

    DWORD dwStatus = 0;
    HCRYPTPROV hProv = 0;
    HCRYPTHASH hHash = 0;
    BYTE pbHash[SHA1LEN];
    BYTE pbRandom[BUFFER_LEN];
    DWORD cbHash = 0;
    CHAR pcDigits[] = "0123456789ABCDEF";
    CHAR pcHash[SHA1LEN * 2 + 1];

    //Get handle to the crypto provider
    if (!CryptAcquireContext(&hProv,
        NULL,
        NULL,
        PROV_RSA_FULL,
        CRYPT_VERIFYCONTEXT))
    {
        dwStatus = GetLastError();
        goto done;
    }

    // Get a random value
    if( CryptGenRandom(
        hProv,
        BUFFER_LEN,
        pbRandom))
    {
        printf("%d bytes of random data have been generated.\n", BUFFER_LEN);
    }
    else
    {
        dwStatus = GetLastError();
        printf("Random bytes were not correctly generated.\n");
        goto done;
    }
   
    if (!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
    {
        dwStatus = GetLastError();
        goto done;
    }
   
    if (!CryptHashData(hHash, pbRandom, BUFFER_LEN, 0))
    {
        dwStatus = GetLastError();
        printf("CryptHashData failed: %d\n", dwStatus);
        goto done;
    }

    cbHash = SHA1LEN;
    if (CryptGetHashParam(hHash, HP_HASHVAL, pbHash, &cbHash, 0))
    {
        printf("SHA1 hash is: ");
        for (DWORD i = 0; i < cbHash; i++)
        {
            pcHash[i * 2]      = pcDigits[pbHash[i] >> 4];
            pcHash[i * 2 + 1 ] = pcDigits[pbHash[i] & 0xf];
            pcHash[i * 2 + 2 ] = '\0';
        }
        printf("%s\n", pcHash);
    }
    else
    {
        dwStatus = GetLastError();
        printf("CryptGetHashParam failed: %d\n", dwStatus);
    }

    done:

    CryptDestroyHash(hHash);
    CryptReleaseContext(hProv, 0);

    WCHAR pwcMessage[BUFFER_LEN];
    MultiByteToWideChar(CP_ACP, 0, pcHash, sizeof(pcHash), pwcMessage, sizeof(pwcMessage));
  
    ccMessage = ( DWORD ) wcslen( pwcMessage );

    if( ( pcMessage = ( PCHAR ) malloc( ccMessage + 1 ) ) )
    {
        WideCharToMultiByte( CP_ACP, 0, pwcMessage, -1, pcMessage, ccMessage + 1, NULL, NULL );
        printf("malloc ok: %s\n", pcMessage);
    }
    else
    {
        printf("Not enough memory");
        dwStatus = ERROR_NOT_ENOUGH_MEMORY;
    }

    return dwStatus;
}