admin-group-nsis-20041004
[openafs.git] / src / WINNT / install / NSIS / AdminGroup.cpp
1 #include<windows.h>
2 #include<string.h>
3 #include<stdio.h>
4 #include<lm.h>
5
6 #pragma comment(lib,"netapi32.lib")
7
8 #define AFSCLIENT_ADMIN_GROUPNAMEW L"AFS Client Admins"
9 #define AFSCLIENT_ADMIN_COMMENTW L"AFS Client Administrators"
10
11 UINT createAfsAdminGroup(void) {
12     LOCALGROUP_INFO_1 gInfo;
13     DWORD dwError;
14     NET_API_STATUS status;
15
16     gInfo.lgrpi1_name = AFSCLIENT_ADMIN_GROUPNAMEW;
17     gInfo.lgrpi1_comment = AFSCLIENT_ADMIN_COMMENTW;
18     status = NetLocalGroupAdd(NULL, 1, (LPBYTE) &gInfo, &dwError);
19
20     return status;
21 }
22
23 UINT initializeAfsAdminGroup(void) {
24     PSID psidAdmin = NULL;
25     SID_IDENTIFIER_AUTHORITY auth = SECURITY_NT_AUTHORITY;
26     NET_API_STATUS status;
27     LOCALGROUP_MEMBERS_INFO_0 *gmAdmins = NULL;
28     DWORD dwNEntries, dwTEntries;
29
30     status = NetLocalGroupGetMembers(NULL, L"Administrators", 0, (LPBYTE *) &gmAdmins, MAX_PREFERRED_LENGTH, &dwNEntries, &dwTEntries, NULL);
31     if(status)
32         return status;
33
34     status = NetLocalGroupAddMembers(NULL, AFSCLIENT_ADMIN_GROUPNAMEW, 0, (LPBYTE) gmAdmins, dwNEntries);
35
36     NetApiBufferFree( gmAdmins );
37
38     return status;
39 }
40
41 UINT removeAfsAdminGroup(void) {
42     NET_API_STATUS status;
43     status = NetLocalGroupDel(NULL, AFSCLIENT_ADMIN_GROUPNAMEW);
44     return status;
45 }
46
47 void showUsage(char * progname) {
48     printf(
49         "Usage: %s [-create | -remove]\n"
50         "  -create : Create AFS Client Admins group and populate it with\n"
51         "            the members of the Administrators group\n"
52         "  -remove : Remove the AFS Client Admins group\n"
53         , progname);
54 }
55
56 int main(int argc, char ** argv) {
57
58     UINT rv = 0;
59
60     if(argc < 2) {
61         showUsage(argv[0]);
62         return 1;
63     }
64
65     if(!stricmp(argv[1], "-create")) {
66         rv = createAfsAdminGroup();
67         if(rv) {
68             if(rv != ERROR_ALIAS_EXISTS) {
69             fprintf(stderr, "%s: Can't create AFS Client Admin group. NetApi error %u\n", rv);
70             } else {
71                 /* The group already exists. (Preserved config from a
72                    prior install). */
73                 rv = 0;
74             }
75         } else {
76             rv = initializeAfsAdminGroup();
77             if(rv)
78                 fprintf(stderr, "%s: Can't populate AFS Client Admin group. NetApi error %u\n", rv);
79         }
80     } else if(!stricmp(argv[1], "-remove")) {
81         removeAfsAdminGroup();
82         rv = 0;
83     } else {
84         showUsage(argv[0]);
85         rv = 0;
86     }
87
88     return rv;
89 }