Getting login name in a service routine

I have the following code in a dummy windows app that works just fine, but when I move the code to a service application (an application that will run as a service) it errors. By erroring I mean that the service starts and stops itself. Is there something in the code that is 'illegal' in a service app? Is there a way I can see WHY it stopped itself? I am using CBuilder++ Rad studio 2007

      NET_API_STATUS netStatus;
      WKSTA_USER_INFO_0 *buf;
      char buffer[1000];
      netStatus = NetWkstaUserGetInfo(NULL, 0, (LPBYTE *)&buf);
      wcstombs(buffer, buf->wkui0_username, 100);
      FILE* file=fopen("C:\\systemlog.txt","at");
      if (file) {
            fprintf(file,"Start : %s\n",DateTimeToStr(Now()).c_str());
            fprintf(file,"        User : %s\n", buffer);

Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

'NetWkstaUserGetInfo()' is most likely to fail in a service (services running under the 'LocalSystem' account have almost OS privileges, but are not allowed to use _any_ networking facilities), and since you're not checking the return value, 'wcstombs()' might cause an access violation. Since you apparently want to get the name of the logged on user, there's a new problem - with XP and later, there might be more than one. The following code should help, though:

// DisplayLocalLogons
// Scans the HKEY_USERS key of the specified computer to see who
// has their profile loaded. Returns true if someone is logged on.
BOOLEAN DisplayLocalLogons( LPWSTR ServerName, LPWSTR UserName  )
    BOOLEAN          first = TRUE;
   TCHAR          errorMessage[1024];
   TCHAR          userName[MAX_NAME_STRING], domainName[MAX_NAME_STRING];
   TCHAR          subKeyName[MAX_PATH];
   DWORD          subKeyNameSize, index;
   DWORD          userNameSize, domainNameSize;
   FILETIME     lastWriteTime;
   HKEY          usersKey;
   PSID          sid;
   SID_NAME_USE sidType;
    BYTE          subAuthorityCount;
   DWORD          authorityVal, revision;
   DWORD          subAuthorityVal[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
   // Use RegConnectRegistry so that we work with remote computers
    if( ServerName ) {
         wprintf(L"Connecting to Registry of %s...", ServerName );
         fflush( stdout );
         if( RegConnectRegistry( ServerName, HKEY_USERS, &usersKey ) != ERROR_SUCCESS) {
              wprintf(L"\r                                                      \r");
              wprintf( L"Error opening HKEY_USERS for %s\n", ServerName );
              return FALSE;
         wprintf(L"\r                                                      \r");
    } else {
         if( RegOpenKey( HKEY_USERS, NULL, &usersKey ) != ERROR_SUCCESS ) {
              wprintf( errorMessage, L"Error opening HKEY_USERS" );
              PrintWin32Error( errorMessage, GetLastError() );
              return FALSE;
   // Enumerate keys under HKEY_USERS
   index = 0;
   subKeyNameSize = sizeof( subKeyName );
   while( RegEnumKeyEx( usersKey, index, subKeyName, &subKeyNameSize,
                        NULL, NULL, NULL, &lastWriteTime ) == ERROR_SUCCESS ) {
       // Ignore the default subkey and win2K user class subkeys
       if( wcsicmp( subKeyName, L".default" ) &&
              !wcsstr( subKeyName, L"Classes")) {
              // Convert the textual SID into a binary SID
           subAuthorityCount= swscanf( subKeyName, L"S-%d-%x-%lu-%lu-%lu-%lu-%lu-%lu-%lu-%lu",
                                       &revision, &authorityVal,
                                       &subAuthorityVal[7] );
           if( subAuthorityCount >= 3 ) {
               subAuthorityCount -= 2;
               // Note: we can only deal with authority values
               // of 4 bytes in length
               authority.Value[5] = *(PBYTE) &authorityVal;
               authority.Value[4] = *((PBYTE) &authorityVal+1);
               authority.Value[3] = *((PBYTE) &authorityVal+2);
               authority.Value[2] = *((PBYTE) &authorityVal+3);
               authority.Value[1] = 0;
               authority.Value[0] = 0;
               // Initialize variables for subsequent operations
               sid = NULL;
               userNameSize   = MAX_NAME_STRING;
               domainNameSize = MAX_NAME_STRING;
               if( AllocateAndInitializeSid( &authority,
                                              &sid )) {
                        // We can finally lookup the account name
                        if( LookupAccountSid( ServerName,
                                                   &sidType )) {
                             // We've successfully looked up the user name
                           if( first && !UserName ) {
                                   wprintf(L"Users logged on locally:\n");
                                  first = FALSE;
                           if( !UserName || !wcsicmp( UserName, userName )) {
                                first = FALSE;
                                if( UserName ) wprintf(RESETLINE L"%s\\%s logged onto %s locally.\n",
                                                                 domainName, UserName, ServerName );
                                else                 wprintf( L"     %s\\%s\n", domainName, userName );
                if( sid ) FreeSid( sid );
       subKeyNameSize = sizeof( subKeyName );
    RegCloseKey( usersKey );
    if( first && !UserName ) wprintf(L"No one is logged on locally.\n");
    return !first;
// Code taken from
// (no longer available)

Open in new window


Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
So, what would you have requested to grade that 'A'? What is missing?
BrianDumasAuthor Commented:
t wouldn't compile as you had written it. So I made some changes to it to make it work. I meant no disfavor though.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Development

From novice to tech pro — start learning today.