Windowsで別マシンにアクセスするときに「\\IPアドレス」みたいな感じのをエクスプローラやファイル名を指定して実行から打ち込む。

このときに、ログイン画面が出て適切なユーザ名とパスワードを打ち込んで晴れてアクセス出来るようになる。
こうなると管理共有とかでCドライブとかDドライブとか見れてウハウハなことになっちゃう。
最低でも、インターネットに公開するサーバではオフにするかFWあたりでがっちり固めようね!
でもまぁ便利だから使っちゃうし、ちょっとした管理ツールをこさえようとしたらあったほうが楽チンだ。
こういうツール作ろうとすると、プログラム側からログインしたいとか思っちゃう。
今までは、事前にエクスプローラとかからログインしておいて実行するとかしてたけど、それもめんどくさくなった。
こういう時に使えるAPIが、WNetAddConnection2/WNetAddConnection3っていうのがある!
どうやらこいつは構造体とかを受け取って仕事をするらしい…
プラットフォーム呼び出しは、構造体があるとめんどくさいという記憶しかないのでスルー。
C++/CLIを使ってラップしてみた。
まず、クラスライブラリでプロジェクトを作ってstdafx.hに下の内容を追加。
#pragma once
#pragma comment(lib, "Mpr.lib")
#include <windows.h>
#include <Vcclr.h>
#pragma comment(lib, "hogehoge.lib")をすっかり忘れてたのは秘密。
続いて、適当なクラスをでっちあげる。
今回はログインさえ出来ればいいので、使用イメージとしては
if (NativeWrap.Win32.NetAddConnect("\\あいぴぃ", "ゆーざめい", "ぱすわぁど")) {
// ログイン成功
} else {
// ログインだめだったよ~
}
くらいのノリでC#から使えるようにしよう。ということでクラス作成。ヘッダに下のような感じでクラスとメソッドを定義!
#pragma once
using namespace System;
namespace NativeWrap {
public ref class Win32
{
public:
static bool NetAddConnect(
String^ host, String^ user, String^ pass);
};
}
cppのほうにメソッドの中身を書く。中身は、API呼んでるだけなのでシンプル。
ポイントをしいて言えばSystem::String^からwchar_t*に変えてるところくらいかな?
// これは メイン DLL ファイルです。
#include "stdafx.h"
#include "NativeWrap.h"
bool NativeWrap::Win32::NetAddConnect(System::String ^host,
System::String ^user,
System::String ^pass)
{
typedef pin_ptr char_ptr;
const char_ptr hostPtr = PtrToStringChars(host);
const char_ptr userPtr = PtrToStringChars(user);
const char_ptr passPtr = PtrToStringChars(pass);
NETRESOURCE res = {0};
res.dwType = RESOURCETYPE_DISK;
res.lpRemoteName = (LPWSTR)hostPtr;
DWORD ret = WNetAddConnection2(
&res,
passPtr,
userPtr,
0);
return ret == NO_ERROR;
}
因みに、動作確認できてません!家にマシン一台しかありませんから。
でも、大体こんな感じ。
使い方は、上で最初のほうに示したとおりです。