Index: /trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp	(revision 29806)
+++ /trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp	(revision 29807)
@@ -823,6 +823,5 @@
                                 rc = RTProcCreateEx(pData->pszCmd, pData->papszArgs, hEnv, RTPROC_FLAGS_SERVICE,
                                                     phStdIn, phStdOut, phStdErr,
-                                                    strlen(pData->pszUser) ? pData->pszUser : NULL,
-                                                    strlen(pData->pszUser) && strlen(pData->pszPassword) ? pData->pszPassword : NULL,
+                                                    pData->pszUser, pData->pszPassword,
                                                     &hProcess);
                                 if (RT_SUCCESS(rc))
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp	(revision 29806)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp	(revision 29807)
@@ -322,7 +322,18 @@
             if (FAILED(rc))
             {
+                /* If we got a VBOX_E_IPRT error we handle the error in a more gentle way
+                 * because it contains more accurate info about what went wrong. */
                 ErrorInfo info(guest);
                 if (info.isFullAvailable())
-                    RTPrintf("ERROR: %ls (%Rhrc).\n", info.getText().raw(), info.getResultCode());
+                {
+                    if (rc == VBOX_E_IPRT_ERROR)
+                    {
+                        RTPrintf("%ls.\n", info.getText().raw());
+                    }
+                    else
+                    {
+                        RTPrintf("ERROR: %ls (%Rhrc).\n", info.getText().raw(), info.getResultCode());
+                    }
+                }
                 break;
             }
Index: /trunk/src/VBox/Main/GuestImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/GuestImpl.cpp	(revision 29806)
+++ /trunk/src/VBox/Main/GuestImpl.cpp	(revision 29807)
@@ -1060,9 +1060,4 @@
                                           tr("The guest did not respond within time (%ums)"), aTimeoutMS);
                         }
-                        else if (vrc == VERR_INVALID_PARAMETER)
-                        {
-                            rc = setError(VBOX_E_IPRT_ERROR,
-                                          tr("The guest reported an unknown process status (%u)"), pData->u32Status);
-                        }
                         else if (vrc == VERR_PERMISSION_DENIED)
                         {
@@ -1072,6 +1067,10 @@
                         else
                         {
-                            rc = setError(E_UNEXPECTED,
-                                          tr("The service call failed with error %Rrc"), vrc);
+                            if (pData->u32Status == PROC_STS_ERROR)
+                                rc = setError(VBOX_E_IPRT_ERROR,
+                                              tr("Process could not be started: %Rrc"), pData->u32Flags);
+                            else
+                                rc = setError(E_UNEXPECTED,
+                                              tr("The service call failed with error %Rrc"), vrc);
                         }               
                     }
Index: /trunk/src/VBox/Runtime/r3/win/process-win.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/win/process-win.cpp	(revision 29806)
+++ /trunk/src/VBox/Runtime/r3/win/process-win.cpp	(revision 29807)
@@ -287,20 +287,22 @@
                                            (LPVOID)pTokenUser,
                                            dwSize,
-                                           &dwSize)
-                    && IsValidSid(pTokenUser->User.Sid)
-                    && EqualSid(pTokenUser->User.Sid, pSID))
+                                           &dwSize))
                 {
-                    if (DuplicateTokenEx(hTokenProc, MAXIMUM_ALLOWED,
-                                         NULL, SecurityIdentification, TokenPrimary, phToken))
+                    if (   IsValidSid(pTokenUser->User.Sid)
+                        && EqualSid(pTokenUser->User.Sid, pSID))
                     {
-                        /*
-                         * So we found the process instance which belongs to the user we want to
-                         * to run our new process under. This duplicated token will be used for
-                         * the actual CreateProcessAsUserW() call then.
-                         */
-                        fFound = TRUE;
+                        if (DuplicateTokenEx(hTokenProc, MAXIMUM_ALLOWED,
+                                             NULL, SecurityIdentification, TokenPrimary, phToken))
+                        {
+                            /*
+                             * So we found the process instance which belongs to the user we want to
+                             * to run our new process under. This duplicated token will be used for
+                             * the actual CreateProcessAsUserW() call then.
+                             */
+                            fFound = TRUE;
+                        }
+                        else
+                            dwErr = GetLastError();
                     }
-                    else
-                        dwErr = GetLastError();
                 }
                 else
@@ -320,5 +322,7 @@
     if (fFound)
         return VINF_SUCCESS;
-    return RTErrConvertFromWin32(dwErr);
+    if (dwErr != NO_ERROR)
+        return RTErrConvertFromWin32(dwErr);
+    return VERR_NOT_FOUND; /* No error occured, but we didn't find the right process. */
 }
 
@@ -649,6 +653,6 @@
                 break;
 
-            case ERROR_PASSWORD_EXPIRED:
-            case ERROR_ACCOUNT_RESTRICTION:
+            case ERROR_PASSWORD_EXPIRED:            
+            case ERROR_ACCOUNT_RESTRICTION: /* See: http://support.microsoft.com/kb/303846/ */
                 rc = VERR_LOGON_FAILURE;
                 break;
