#include #include #include #include #include #include #include #include int impersonate(char *user) { long flags = 0; long usrpro = 0; long uiitmlst = 0; long uipersona = 0; long uiprevious = 0; struct dsc$descriptor UserName; /* struct dsc$descriptor_s UserName; */ int status = 0; printf ("Attempting to create persona\n"); if (user) { /* UserName.dsc$b_dtype = DSC$K_DTYPE_T; UserName.dsc$b_class = DSC$K_CLASS_S; */ UserName.dsc$w_length = (unsigned short) strlen(user); UserName.dsc$a_pointer = user; status = sys$persona_create(&uipersona, (void *)&UserName, 0); switch (status) { case SS$_NORMAL: /* The service completed successfully. */ puts("SYS$PERSONNA_CREATE succeeded"); break; case SS$_ACCVIO: /* The persona argument cannot be written by the caller. */ puts("SYS$PERSONNA_CREATE had an access violation"); break; case SS$_NODETACH: /* Operation requires DETACH privilege. */ puts("SYS$PERSONNA_CREATE user had no detach priv"); break; case SS$_INSFMEM: /* Insufficient memory */ puts("SYS$PERSONNA_CREATE user had insufficient memory "); break; /* * case IMP$_USERDISABLED: /* User name disabled. * * puts("SYS$PERSONNA_CREATE is disabled for this * user"); break; */ default: puts("Unexpected return from sys$persona_create()"); printf("Error = %d\n", status); } if (status == SS$_NORMAL) { uipersona = 1; /* thats what the book says */ flags = IMP$M_ASSUME_SECURITY; /* changes username */ status = sys$persona_assume(&uipersona, flags); switch (status) { case SS$_NORMAL: /* The service completed successfully; the desired access is granted. */ puts("SYS$PERSONNA_ASSUME succeeded"); break; /* * case IMP$_NOCHJIB: Information Block * cannot be modified. * puts("SYS$PERSONNA_ASSUME failed because * job information block cannot be * modified"); break; */ /* * case IMP$_PERSONANONGRATA: * puts("SYS$PERSONNA_ASSUME failed because * persona argument was invalid"); break; */ default: puts("SYS$PERSONNA_ASSUME returned an unexpected status code"); } status = sys$persona_delete(&uipersona); switch (status) { case SS$_NORMAL: /* The service completed successfully. */ puts("SYS$PERSONNA_DELETE succeeded"); break; case SS$_INUSE: /* Persona is in use; it cannot be deleted. */ puts("SYS$PERSONNA_DELETE failed because the program is still in use"); break; default: puts("SYS$PERSONNA_DELETE returned an unexpected status code"); } } } printf ("Exit Impersonate\n"); return status; } #ifdef TEST int main(void) { /* impersonate("UIUIUIU"); printf("Done with first impersonation\n"); */ impersonate("LMCGHAW"); impersonate("MCKEE"); impersonate("EDZ"); impersonate("HUMPHREY"); impersonate("BOGART"); impersonate(""); impersonate(NULL); } #endif