EternalWindows
アカウント管理 / グループの作成

グループは、複数のユーザーを一様に扱う上で便利な存在です。 たとえば、複数のユーザーに同じ特権を割り当てるならば、 1つのグループにその特権を割り当て、 複数のユーザーはそのグループに属したほうが効率的です。 また、複数のユーザーにオブジェクトへのアクセスを許可する場合についても、 1つのグループにアクセスを許可すれば同じ結果が得られます。 新しいグループを作成するには、NetLocalGroupAddを呼び出します。

NET_API_STATUS NetLocalGroupAdd(
  LPCWSTR servername,
  DWORD level,
  LPBYTE buf,
  LPDWORD parm_err
);

servernameは、servernameは、この関数を実行するサーバー名を指定します。 NULLを指定した場合は、ローカルコンピュータで実行されます。 levelは、情報レベルを指定します。 bufは、追加したいグループの情報を格納したバッファを指定します。 parm_errは、エラーの原因となったメンバのインデックスを受け取る変数のアドレスを指定します。 どのメンバに問題があるのかを特定したくない場合は、NULLを指定しても問題ありません。

NetLocalGroupAddで作成したグループを削除するには、NetLocalGroupDelを呼び出します。

NET_API_STATUS NetLocalGroupDel(
  LPCWSTR servername,
  LPCWSTR groupname
);

servernameは、servernameは、この関数を実行するサーバー名を指定します。 NULLを指定した場合は、ローカルコンピュータで実行されます。 groupnameは、削除したいグループの名前を指定します。

今回のプログラムは、独自のグループを作成し、 これに前節で作成したユーザーを追加します。 管理者として実行しなければ失敗することになります。

#include <windows.h>
#include <lm.h>

#pragma comment (lib, "netapi32.lib")

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	BOOL                      bAdd = TRUE;
	WCHAR                     szGroupName[] = L"mygroup";
	WCHAR                     szDomainAndName[1024];
	WCHAR                     szDomainName[256];
	DWORD                     dwSize;
	DWORD                     dwError;
	LOCALGROUP_INFO_0         groupInfo;
	LOCALGROUP_MEMBERS_INFO_3 membersInfo;

	if (bAdd) {
		groupInfo.lgrpi0_name = szGroupName;
		if (NetLocalGroupAdd(NULL, 0, (LPBYTE)&groupInfo, &dwError) != NERR_Success) {
			MessageBox(NULL, TEXT("グループの作成に失敗しました。"), NULL, MB_ICONWARNING);
			return 0;
		}
		
		dwSize = sizeof(szDomainName) / sizeof(TCHAR);
		GetComputerName(szDomainName, &dwSize);
		wsprintfW(szDomainAndName, L"%s\\%s", szDomainName, L"myuser");

		membersInfo.lgrmi3_domainandname = szDomainAndName;
		if (NetLocalGroupAddMembers(NULL, szGroupName, 3, (LPBYTE)&membersInfo, 1) != NERR_Success) {
			MessageBox(NULL, TEXT("ユーザーをグループへ追加することに失敗しました。"), NULL, MB_ICONWARNING);
			return 0;
		}
	}
	else {
		if (NetLocalGroupDel(NULL, szGroupName)  != NERR_Success) {
			MessageBox(NULL, TEXT("グループの削除に失敗しました。"), NULL, MB_ICONWARNING);
			return 0;
		}
		
		MessageBox(NULL, TEXT("グループを削除しました。"), TEXT("OK"), MB_OK);
	}

	return 0;
}

bAddがTRUEの場合は、NetLocalGroupAddを呼び出してmygroupという名前のグループを作成します。 そして、NetLocalGroupAddMembersを呼び出すことで、 前節で作成したmyuserというユーザーをmygroupに追加します。 ユーザーが独自のグループに属している場合、 そのユーザーがログオンした場合に作成されるトークンには、 独自のグループのSIDが含まれることになります。


戻る