mturk 2003/02/07 10:56:33
Modified: daemon/src/native/nt/procrun readme.txt procrun.h procrun.c
Log:
Added --User and --Password to enable to run the
redirected process under other account.
Revision Changes Path
1.2 +7 -0 jakarta-commons-sandbox/daemon/src/native/nt/procrun/readme.txt
Index: readme.txt
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/daemon/src/native/nt/procrun/readme.txt,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- readme.txt 7 Feb 2003 07:04:35 -0000 1.1
+++ readme.txt 7 Feb 2003 18:56:33 -0000 1.2
@@ -106,6 +106,13 @@
The services startup mode Automatic or Manual.
Default value is auto.
+--User <username>
+ The User account used for launching redirected process.
+
+--Password <password>
+ The password of User account used for launching
+ redirected process.
+
Examples:
Installing Tomcat as service:
1.2 +4 -0 jakarta-commons-sandbox/daemon/src/native/nt/procrun/procrun.h
Index: procrun.h
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/daemon/src/native/nt/procrun/procrun.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- procrun.h 7 Feb 2003 07:04:35 -0000 1.1
+++ procrun.h 7 Feb 2003 18:56:33 -0000 1.2
@@ -113,6 +113,8 @@
#define PROCRUN_PARAMS_STARTCLASS "StartupClass"
#define PROCRUN_PARAMS_STOPCLASS "ShutdownClass"
#define PROCRUN_PARAMS_STARTUP "Startup"
+#define PROCRUN_PARAMS_ACCOUNT "User"
+#define PROCRUN_PARAMS_PASSWORD "Password"
#define PROCRUN_DEFAULT_CLASS "Main"
@@ -173,6 +175,8 @@
char *description;
char *path;
char *image;
+ char *account;
+ char *password;
HANDLE infile;
HANDLE outfile;
HANDLE errfile;
1.3 +145 -19 jakarta-commons-sandbox/daemon/src/native/nt/procrun/procrun.c
Index: procrun.c
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/daemon/src/native/nt/procrun/procrun.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- procrun.c 7 Feb 2003 09:58:48 -0000 1.2
+++ procrun.c 7 Feb 2003 18:56:33 -0000 1.3
@@ -215,6 +215,40 @@
return h;
}
+static void simple_encrypt(int seed, const char *str, unsigned char bytes[256])
+{
+ int i;
+ char sc[256];
+
+ srand(seed);
+ memset(sc, 0, 256);
+ strncpy(sc, str, 255);
+ for (i = 0; i < 256; i ++) {
+ bytes[i] = ((rand() % 256) ^ sc[i]);
+ }
+}
+
+static void simple_decrypt(int seed, char *str, unsigned char bytes[256])
+{
+ int i;
+ char sc[256];
+
+ srand(seed);
+ for (i = 0; i < 256; i ++) {
+ sc[i] = ((rand() % 256) ^ bytes[i]);
+ }
+ strcpy(str, sc);
+}
+
+static void test_enc()
+{
+ unsigned char b[256];
+ char op[32];
+ simple_encrypt(100, "test encryption", b);
+ simple_decrypt(100, op, b);
+ DBPRINTF1("ENC %s", op);
+}
+
static void inject_exitprocess(PROCESS_INFORMATION *child)
{
PFNCREATERTHRD pfn_CreateRemoteThread;
@@ -237,8 +271,8 @@
}
GenerateConsoleCtrlEvent(CTRL_C_EVENT, child->dwProcessId);
GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, child->dwProcessId);
-#if 0
- Sleep(500);
+#if 1
+ Sleep(2000);
#endif
if (!GetExitCodeProcess(child->hProcess, &stat) ||
(stat != STILL_ACTIVE)) {
@@ -671,6 +705,19 @@
proc->service.image = pool_strdup(proc->pool, kval);
}
klen = MAX_PATH;
+ if ((err = RegQueryValueEx(key, PROCRUN_PARAMS_ACCOUNT, NULL, NULL,
+ (unsigned char *)kval,
+ &klen)) == ERROR_SUCCESS) {
+ proc->service.account = pool_strdup(proc->pool, kval);
+ }
+ klen = MAX_PATH;
+ if ((err = RegQueryValueEx(key, PROCRUN_PARAMS_PASSWORD, NULL, NULL,
+ (unsigned char *)kval,
+ &klen)) == ERROR_SUCCESS) {
+ proc->service.password = pool_calloc(proc->pool, 256);
+ simple_decrypt(100, proc->service.password, kval);
+ }
+ klen = MAX_PATH;
if ((err = RegQueryValueEx(key, PROCRUN_PARAMS_STARTCLASS, NULL, NULL,
(unsigned char *)kval,
&klen)) == ERROR_SUCCESS) {
@@ -1258,9 +1305,10 @@
return 0;
}
+
int procrun_redirect(char *program, char **envp, procrun_t *env)
{
- STARTUPINFO si;
+ STARTUPINFO si;
DWORD id;
memset(&si, 0, sizeof(STARTUPINFO));
@@ -1312,21 +1360,67 @@
program = env->m->java.path;
}
DBPRINTF2("RUN [%s] %s\n", program, env->m->argw);
- if (!CreateProcess(program,
- env->m->argw,
- NULL,
- NULL,
- TRUE,
- CREATE_SUSPENDED | CREATE_NEW_CONSOLE |
- CREATE_NEW_PROCESS_GROUP,
- env->m->envw,
- env->m->service.path,
- &si,
- &env->c->pinfo)) {
+ if (env->m->service.account && env->m->service.password &&
+ env->m->service.mode == 1) {
+ HANDLE user, token;
+ if (!LogonUser(env->m->service.account,
+ NULL,
+ env->m->service.password,
+ LOGON32_LOGON_SERVICE,
+ LOGON32_PROVIDER_DEFAULT,
+ &user)) {
+ DBPRINTF0(NULL);
+ DBPRINTF0("LogonUser failed");
+ return -1;
+ }
- DBPRINTF1("Error redirecting '%s'\n", program);
+ DuplicateTokenEx(user,
+ TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY,
+ NULL,
+ SecurityImpersonation,
+ TokenPrimary,
+ &token);
DBPRINTF0(NULL);
- return -1;
+
+ DBPRINTF2("Launching as %s:%s", env->m->service.account,
env->m->service.password);
+ ImpersonateLoggedOnUser(token);
+ DBPRINTF0(NULL);
+ si.lpDesktop = (LPSTR) "Winsta0\\Default";
+ if (!CreateProcessAsUser(token,
+ program,
+ env->m->argw,
+ NULL,
+ NULL,
+ TRUE,
+ CREATE_SUSPENDED | CREATE_NEW_CONSOLE |
+ CREATE_NEW_PROCESS_GROUP,
+ env->m->envw,
+ env->m->service.path,
+ &si,
+ &env->c->pinfo)) {
+
+ DBPRINTF1("Error redirecting '%s'\n", program);
+ DBPRINTF0(NULL);
+ return -1;
+ }
+ }
+ else {
+ if (!CreateProcess(program,
+ env->m->argw,
+ NULL,
+ NULL,
+ TRUE,
+ CREATE_SUSPENDED | CREATE_NEW_CONSOLE |
+ CREATE_NEW_PROCESS_GROUP,
+ env->m->envw,
+ env->m->service.path,
+ &si,
+ &env->c->pinfo)) {
+
+ DBPRINTF1("Error redirecting '%s'\n", program);
+ DBPRINTF0(NULL);
+ return -1;
+ }
}
pool_handle(env->c->pool, env->c->pinfo.hThread);
pool_handle(env->c->pool, env->c->pinfo.hProcess);
@@ -1356,7 +1450,7 @@
DWORD c, type = REG_SZ;
- if (service) {
+ if (service == 1) {
sprintf(skey, PROCRUN_REGKEY_SERVICES, proc->service.name);
if ((err = RegOpenKeyEx(HKEY_LOCAL_MACHINE, skey,
0, KEY_SET_VALUE, &key)) != ERROR_SUCCESS) {
@@ -1377,7 +1471,9 @@
DBPRINTF2("Creating [%s] name [%s]\n", skey, name);
DBPRINTF2("Creating [%s] value [%s]\n", skey, value);
if (value) {
- if (len > 0)
+ if (service == 2)
+ type = REG_BINARY;
+ else if (len > 0)
type = REG_MULTI_SZ;
else
len = strlen(value);
@@ -1454,6 +1550,10 @@
else if (stricmp(argv[i], "manual") == 0)
proc->service.startup = SERVICE_DEMAND_START;
}
+ else if (STRNI_COMPARE(argp, PROCRUN_PARAMS_ACCOUNT))
+ proc->service.account = pool_strdup(proc->pool, argv[++i]);
+ else if (STRNI_COMPARE(argp, PROCRUN_PARAMS_PASSWORD))
+ proc->service.password = pool_strdup(proc->pool, argv[++i]);
else {
DBPRINTF1("Unrecognized option %s\n", argv[i]);
break;
@@ -1550,6 +1650,15 @@
if (proc->java.stop_class)
set_service_param(proc, PROCRUN_PARAMS_STOPCLASS,
proc->java.stop_class, 0, 0);
+ if (proc->service.account)
+ set_service_param(proc, PROCRUN_PARAMS_ACCOUNT,
+ proc->service.account, 0, 0);
+ if (proc->service.password) {
+ unsigned char b[256];
+ simple_encrypt(100, proc->service.password, b);
+ set_service_param(proc, PROCRUN_PARAMS_PASSWORD,
+ b, 256, 2);
+ }
if (proc->java.opts) {
int l = strlen(proc->java.opts);
/* change the string to zero separated for MULYI_SZ */
@@ -1643,6 +1752,10 @@
else if (stricmp(argv[i], "manual") == 0)
proc->service.startup = SERVICE_DEMAND_START;
}
+ else if (STRNI_COMPARE(argp, PROCRUN_PARAMS_ACCOUNT))
+ proc->service.account = pool_strdup(proc->pool, argv[++i]);
+ else if (STRNI_COMPARE(argp, PROCRUN_PARAMS_PASSWORD))
+ proc->service.password = pool_strdup(proc->pool, argv[++i]);
else
break;
}
@@ -1727,6 +1840,15 @@
if (proc->java.stop_class)
set_service_param(proc, PROCRUN_PARAMS_STOPCLASS,
proc->java.stop_class, 0, 0);
+ if (proc->service.account)
+ set_service_param(proc, PROCRUN_PARAMS_ACCOUNT,
+ proc->service.account, 0, 0);
+ if (proc->service.password) {
+ unsigned char b[256];
+ simple_encrypt(100, proc->service.password, b);
+ set_service_param(proc, PROCRUN_PARAMS_PASSWORD,
+ b, 256, 2);
+ }
if (proc->java.opts) {
int l = strlen(proc->java.opts);
/* change the string to zero separated for MULYI_SZ */
@@ -2026,6 +2148,10 @@
case PROCRUN_CMD_DELETE_SERVICE:
rv = procrun_delete_service(env->m);
break;
+ case PROCRUN_CMD_STOP_SERVICE:
+ rv = -1;
+ DBPRINTF0("STOP SERVICE is unimplemented for now");
+ break;
case PROCRUN_CMD_RUN_SERVICE:
debug_process(argc, argv, env->m);
env->m->service.mode = 1;
@@ -2105,11 +2231,11 @@
void __cdecl main(int argc, char **argv)
{
+
procrun_t *env = alloc_environment();
g_proc_mode = PROCRUN_MODE_CONSOLE;
g_env = env;
- AllocConsole();
procrun_main(argc, argv, _environ, env);
free_environment(env);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]