企業でネットワークを使われている皆様、ネットワークで不正が行われていることを意識したことがありますか。
ソフトウェア(市販ソフト、音楽ソフトなど)の違法コピーがネットワークに蔓延している企業は危ないです。
不正だと思われる共有フォルダを発見するための手助けをする簡単なプログラムを公開します。
IsInvalidName関数のif文を適宜書き換えて、ご利用ください。
//////////////////////////////////////////////////////
// FindInvalidShare.c
// Author: Akira Onishi
// cl FindInvalidShare.c /link Netapi32.lib
//////////////////////////////////////////////////////
#define UNICODE
#include <windows.h>
#include <stdio.h>
#include <lm.h>
int HasKeyWord(LPWSTR name, LPWSTR keyword)
{
wchar_t *p, *k;
p = wcschr(name, keyword[0]);
if (p == NULL) {
return 0;
}
p ++;
k = keyword+1;
while (*k != 0) {
if (*p != *k) {
return 0;
}
p++;
k++;
}
return 1;
}
/*
怪しい共有フォルダを判定する
*/
int IsInvalidName(LPWSTR name)
{
if (HasKeyWord(name, L"usic")) return 1;
if (HasKeyWord(name, L"MP3" )) return 1;
if (HasKeyWord(name, L"mp3" )) return 1;
if (HasKeyWord(name, L"SONG")) return 1;
if (HasKeyWord(name, L"ongs")) return 1;
if (HasKeyWord(name, L"ovie")) return 1;
if (HasKeyWord(name, L"Game")) return 1;
return 0;
}
void wmain(int argc, TCHAR *lpszArgv[])
{
PSHARE_INFO_0 BufPtr,p;
NET_API_STATUS res;
LPTSTR lpszServer = NULL;
DWORD er=0,tr=0,resume=0, i;
switch(argc) {
case 2:
lpszServer = lpszArgv[1];
break;
default:
lpszServer = NULL;
printf("Usage: FindInvalidShare <コンピュータ名>\n");
return;
}
do {
res = NetShareEnum (lpszServer, 0, (LPBYTE *) &BufPtr,
-1, &er, &tr, &resume);
if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA) {
p=BufPtr;
for(i=1;i<=er;i++) {
if (IsInvalidName(p->shi0_netname)) {
printf("%S\\%S\n",lpszServer, p->shi0_netname);
}
p++;
}
NetApiBufferFree(BufPtr);
}
else
printf("Error: %ld\n",res);
} while (res==ERROR_MORE_DATA);
return;
}
Windowsネットワークのコンピュータ一覧は、NET VIEWコマンドで取得できます。
取得したコンピュータ名を使って、FindInvalidShareコマンドを呼び出すと、IsInvalidName関数に定義されたキーワードに部分一致する共有フォルダを持っていればコンピュータ名と共有名がコンソールに出力されます。