|
@@ -2156,8 +2156,10 @@ nt_service_install(int argc, char **argv)
|
|
|
char *errmsg;
|
|
|
const char *user_acct = GENSRV_USERACCT;
|
|
|
int i;
|
|
|
+ OSVERSIONINFOEX info;
|
|
|
SID_NAME_USE sidUse;
|
|
|
- DWORD zero = 0;
|
|
|
+ DWORD sidLen = 0, domainLen = 0;
|
|
|
+ int is_win2k_or_worse = 0;
|
|
|
|
|
|
if (nt_service_loadlibrary()<0)
|
|
|
return -1;
|
|
@@ -2178,20 +2180,43 @@ nt_service_install(int argc, char **argv)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (service_fns.LookupAccountNameA_fn(NULL, // On this system
|
|
|
- user_acct,
|
|
|
- NULL,
|
|
|
- &zero, // Don't care about the SID
|
|
|
- NULL,
|
|
|
- &zero, // Don't care about the domain
|
|
|
- &sidUse) == 0) {
|
|
|
+ /* Compute our version and see whether we're running win2k or earlier. */
|
|
|
+ memset(&info, 0, sizeof(info));
|
|
|
+ info.dwOSVersionInfoSize = sizeof(info);
|
|
|
+ if (! GetVersionEx((LPOSVERSIONINFO)&info)) {
|
|
|
+ printf("Call to GetVersionEx failed.\n");
|
|
|
+ is_win2k_or_worse = 1;
|
|
|
+ } else {
|
|
|
+ if (info.dwMajorVersion < 5 ||
|
|
|
+ (info.dwMajorVersion == 5 && info.dwMinorVersion == 0))
|
|
|
+ is_win2k_or_worse = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (user_acct == GENSRV_USERACCT) {
|
|
|
+ if (is_win2k_or_worse) {
|
|
|
+ /* On Win2k, there is no LocalService account, so we actually need to
|
|
|
+ * fall back on NULL (the system account). */
|
|
|
+ printf("Running on Win2K or earlier, so the LocalService account "
|
|
|
+ "doesn't exist. Falling back to SYSTEM account.\n");
|
|
|
+ user_acct = NULL;
|
|
|
+ } else {
|
|
|
+ /* Genericity is apparently _so_ last year in Redmond, where some
|
|
|
+ * accounts are accounts that you can look up, and some accounts
|
|
|
+ * are magic and undetectable via the security subsystem. See
|
|
|
+ * http://msdn2.microsoft.com/en-us/library/ms684188.aspx
|
|
|
+ */
|
|
|
+ printf("Running on a Post-Win2K OS, so we'll assume that the "
|
|
|
+ "LocalService account exists.\n");
|
|
|
+ }
|
|
|
+ } else if (service_fns.LookupAccountNameA_fn(NULL, // On this system
|
|
|
+ user_acct,
|
|
|
+ NULL, &sidLen, // Don't care about the SID
|
|
|
+ NULL, &domainLen, // Don't care about the domain
|
|
|
+ &sidUse) == 0) {
|
|
|
printf("User \"%s\" doesn't seem to exist.\n", user_acct);
|
|
|
- if (user_acct != GENSRV_USERACCT)
|
|
|
- return -1;
|
|
|
- /* On Win2k, there is no LocalService account, so we actually need to
|
|
|
- * check for it. Yay win2k. */
|
|
|
- printf("Falling back to SYSTEM account.\n");
|
|
|
- user_acct = NULL;
|
|
|
+ return -1;
|
|
|
+ } else {
|
|
|
+ printf("Will try to install service as user \"%s\".\n", user_acct);
|
|
|
}
|
|
|
|
|
|
/* Create the Tor service, set to auto-start on boot */
|