Windows2000/private/ntos/se/dumpuser.c

325 lines
8.8 KiB
C

/* Defines for Jim */
// #define LONGNAMES
#define SECPKG "[Tmpv1_0]"
#ifdef LONGNAMES
#define SERVOP "DOMAIN_SERVER_OPERATORS "
#define ACCTOP "DOMAIN_ACCOUNT_OPERATORS "
#define COMMOP "DOMAIN_COMM_OPERATORS "
#define PRINTOP "DOMAIN_PRINT_OPERATORS "
#define DISKOP "DOMAIN_DISK_OPERATORS "
#define AUDITOP "DOMAIN_AUDIT_OPERATORS "
#define GADMINS "DOMAIN_ADMIN "
#define GUSERS "DOMAIN_USERS "
#define GGUESTS "DOMAIN_GUESTS "
#else
#define SERVOP "D_SERVER "
#define ACCTOP "D_ACCOUN "
#define COMMOP "D_COMM_O "
#define PRINTOP "D_PRINT_ "
#define DISKOP "D_DISK_O "
#define AUDITOP "D_AUDIT_ "
#define GADMINS "D_ADMIN "
#define GUSERS "D_USERS "
#define GGUESTS "D_GUESTS "
#endif
#define INCL_DOSMEMMGR
#include <os2.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netcons.h>
#include <neterr.h>
#include <netlib.h>
#include <uascache.h>
#include <access.h>
#include <permit.h>
#include "ssitools.h"
char FAR * buf1;
char FAR * buf2;
char FAR * GroupCache;
char path[256];
char userbuf[MAX_USER_SIZE];
unsigned short Handle;
struct _ahdr FAR * Header;
void InitMemStuff(void);
void loadit(void);
void showentries(void);
void doargs(int, char**);
struct my_group {
char name[GNLEN + 1];
char pad;
unsigned short gid;
unsigned long serial;
};
static int
UserHashVal(uname, domain)
const char far *uname;
int domain;
{
register unsigned val=0;
register unsigned char c;
while ((c= (unsigned char) *uname++))
val += toupper(c);
return (int) (val % domain);
}
unsigned
dread(unsigned handle, unsigned long pos, char far * buffer, unsigned length)
{
unsigned short err, bread;
unsigned long newpos;
err = DosChgFilePtr(handle, pos, FILE_BEGIN, &newpos);
if (err)
return err;
if (newpos != pos)
return NERR_ACFFileIOFail;
err = DosRead( handle, buffer, length, &bread);
if (err)
return err;
if (bread != length)
return NERR_ACFFileIOFail;
return 0;
}
unsigned read_object(unsigned handle, unsigned long pos, char FAR * buf)
{
unsigned err;
struct disk_obj_hdr FAR * dobj;
err = dread(handle, pos, buf, sizeof(struct disk_obj_hdr));
if (err)
return err;
dobj = (struct disk_obj_hdr FAR *) buf;
return dread(handle, pos, buf, dobj->do_numblocks * 64);
}
void InitMemStuff()
{
unsigned short err;
unsigned short sel, action;
err = DosAllocSeg(0x8000, &sel, 0);
if (err) {
printf("Could not alloc memory, error %d\n", err);
exit(1);
}
buf1 = MAKEP(sel, 0);
err = DosAllocSeg(0x8000, &sel, 0);
if (err) {
printf("Could not alloc memory, error %d\n", err);
exit(1);
}
buf2 = MAKEP(sel, 0);
err = DosAllocSeg(1024, &sel, 0);
if (err) {
printf("Could not alloc memory, error %d\n", err);
exit(1);
}
Header = MAKEP(sel, 0);
if (err = DosAllocSeg(0x8000, &sel, 0)) {
printf("Could not alloc memory, error %d\n", err);
exit(1);
}
GroupCache = MAKEP(sel, 0);
err = DosOpen(path, &Handle, &action, 0L, 0, FILE_OPEN,
OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0L);
if (err) {
printf("Error opening %s, code %d\n", path, err);
exit(1);
}
err = DosRead(Handle, Header, 512, &action);
if (err || action != 512) {
printf("Error reading from file, code %d\n", err);
exit(1);
}
printf("Total users, %d\n", Header->num_users);
}
void loadit()
{
unsigned short err;
unsigned short action;
unsigned short i;
unsigned long pos;
struct diskuserhash FAR *diskhashentry;
struct userhash FAR *userhashentry;
struct _grouprec FAR * grec;
struct my_group FAR * mygroup;
err = DosChgFilePtr(Handle, 512L, FILE_BEGIN, &pos);
err = DosRead(Handle, buf1, sizeof(struct _grouprec) * MAXGROUP, &action);
if (err || action != sizeof(struct _grouprec) * MAXGROUP) {
printf("Error reading from file, %d\n", err);
exit(1);
}
mygroup = (struct my_group FAR *) GroupCache;
grec = (struct _grouprec FAR *) buf1;
for (i = 0; i < MAXGROUP ; i++, grec++, mygroup++ ) {
if (grec->name[0] != REC_EMPTY && grec->name[0] != REC_DELETE) {
/* if (strcmpf(grec->name, "ADMINS") == 0) {
strcpyf(mygroup->name, GADMIN);
else if (strcmpf(grec->name, "USERS") == 0)
strcpyf(mygroup->name, GUSERS);
else if (strcmpf(grec->name, "GUESTS") == 0)
strcpyf(mygroup->name, GGUESTS);
else */
strncpyf(mygroup->name, grec->name, GNLEN);
mygroup->gid = UserHashVal(mygroup->name, MAXGROUP);
mygroup->serial = grec->serial;
} else
mygroup->name[0] = '\0';
}
err = DosChgFilePtr(Handle, (unsigned long) HASH_TBL_OFFSET, FILE_BEGIN, &pos);
diskhashentry = (struct diskuserhash FAR *) buf1;
if (err = DosRead (Handle, diskhashentry, HASH_TBL_SIZE, &action)) {
printf("Could not read hash table, error %d\n", err);
exit(1);
}
if (action != HASH_TBL_SIZE) {
printf("Could not read hash table\n");
exit(1);
}
/*
* Copy disk user hash table into memory
*/
userhashentry = (struct userhash FAR *) buf2;
for (i = 0; i < USER_HASH_ENTRIES; i++) {
userhashentry->uh_disk = diskhashentry->dh_disk;
userhashentry->uh_serial = diskhashentry->dh_serial;
userhashentry->uh_cache = NULL;
userhashentry++;
diskhashentry++;
}
}
void printgroups()
{
struct my_group FAR * mygroup = (struct my_group FAR *) GroupCache;
unsigned i;
unsigned long relid;
printf("\t// Groups\n");
for (i = 0; i< MAXGROUP ; i++, mygroup++ ) {
if (mygroup->name[0]) {
relid = ((mygroup->gid | GROUPIDMASK) + (mygroup->serial << 16)) ^ 0x80000000L;
printf("\tGroup = %ld %Fs\n", relid, mygroup->name);
}
}
}
void showentries()
{
unsigned i, j, k;
unsigned err;
unsigned long pos, oprights;
signed long relativeid;
unsigned usercount = 0;
struct userhash FAR * entry = (struct userhash FAR *) buf2;
struct user_object FAR * uo = (struct user_object FAR *) userbuf;
struct my_group FAR * mygroup = (struct my_group FAR *) GroupCache;
unsigned char FAR * gmask;
unsigned char test;
char groupnames[256];
printf("\n\n\t// Users\n");
for (i = 0; i < USER_HASH_ENTRIES ; i++ ) {
pos = entry->uh_disk;
while (pos) {
if (err = read_object(Handle, pos, userbuf)) {
printf("Failed reading object, code %d\n", err);
exit(1);
}
relativeid = ( ((uo->uo_record.user.uc0_guid.guid_serial) << 16) +
(uo->uo_record.user.uc0_guid.guid_uid) ) ^ 0x80000000;
gmask = uo->uo_record.user.uc0_groups;
groupnames[0] = '\0';
for (j = 0; j < 32 ; j++ ) {
test = gmask[j];
k = 0;
while (test) {
if (test & 1) {
strcatf(groupnames, mygroup[j * 8 + k].name);
strcatf(groupnames, " ");
}
test >>= 1;
k++;
}
}
oprights = uo->uo_record.user.uc0_auth_flags;
if (oprights & AF_OP_PRINT)
strcat(groupnames, PRINTOP);
if (oprights & AF_OP_COMM)
strcat(groupnames, COMMOP);
if (oprights & AF_OP_SERVER)
strcat(groupnames, SERVOP);
if (oprights & AF_OP_ACCOUNTS)
strcat(groupnames, ACCTOP);
printf("\tUser = %ld %Fs %Fs\n", relativeid,
(char FAR *) uo->uo_record.name,
(char FAR *) groupnames);
usercount++;
pos = uo->uo_header.do_next;
}
entry++;
}
if (usercount != Header->num_users) {
printf("Huh? Didn't find all the users (found %d)\n", usercount);
}
}
void banner(unsigned longnames)
{
printf(SECPKG);
printf("\n\n\t//\n\t// Account Setup information\n");
printf("\t// This file produced from the LAN Manager 2.0 UAS\n");
printf("\t// %s\n", path);
printf("\tGroup = 501 %s\n", GADMINS);
printf("\tGroup = 502 %s\n", GUSERS);
printf("\tGroup = 503 %s\n", GGUESTS);
printf("\tGroup = 504 %s\n", ACCTOP);
printf("\tGroup = 505 %s\n", SERVOP);
printf("\tGroup = 506 %s\n", PRINTOP);
printf("\tGroup = 507 %s\n", COMMOP);
printf("\tGroup = 508 %s\n", DISKOP);
printf("\tGroup = 509 %s\n", AUDITOP);
}
void doargs(int argc, char **argv)
{
if (argc != 2 || *argv[1] == '?') {
printf("usage: %s path\\net.acc\n", argv[0]);
printf("\tlists all the users/groups and their hash/serial numbers for a UAS\n");
exit(0);
}
strcpy(path, argv[1]);
}
main (int argc, char *argv[])
{
printf(SIGNON);
doargs(argc, argv);
InitMemStuff();
loadit();
banner(0);
printgroups();
showentries();
}