• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 270
  • Last Modified:

Thread ID

How do i get the threadID for an other running window?
0
telebasics
Asked:
telebasics
  • 3
  • 3
  • 2
1 Solution
 
jkrCommented:
To enumerate all users, use

#include <windows.h>
#include <lm.h>
#include <stdio.h>
#pragma hdrstop



// 28jul97 felixk   fixed a nasty bug in do_NetQueryDisplayInformation
//                  (next_index was set even if read == 0: accvio)


void print_user( const wchar_t *name, DWORD flags )
{
      // NOTE: capital "S" in a printf format string means "Unicode",
      // if we are an ANSI program

      printf( "%-40.40S ", name ); // display Unicode user name
      if ( flags & UF_NORMAL_ACCOUNT )
            puts( "(domain user)" );
      else if ( flags & UF_TEMP_DUPLICATE_ACCOUNT )
            puts( "(local user)" );
      else if ( flags & UF_WORKSTATION_TRUST_ACCOUNT )
            puts( "(computer account)" );
      else if ( flags & UF_SERVER_TRUST_ACCOUNT )
            puts( "(PDC/BDC computer account)" );
      else if ( flags & UF_INTERDOMAIN_TRUST_ACCOUNT )
            puts( "(trusted domain account)" );
      else
            puts( "(funny account type)" );
}



void do_NetUserEnum( const wchar_t *server )
{
      USER_INFO_1 *buf, *cur;
      DWORD read, totalremaining, resumeh, rc, i;

      resumeh = 0;
      do
      {
            buf = NULL;
            rc = NetUserEnum( server, 1, 0, (BYTE **) &buf, 1024, &read, &totalremaining, &resumeh );
            if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
                  break;

            printf( "\ngot %lu entries out of %lu\n", read, totalremaining );
            for ( i = 0, cur = buf; i < read; ++ i, ++ cur )
                  print_user( cur->usri1_name, cur->usri1_flags );

            if ( buf != NULL )
                  NetApiBufferFree( buf );

      } while ( rc == ERROR_MORE_DATA );

      if ( rc != ERROR_SUCCESS )
            printf( "NUE() returned %lu\n", rc );
}



void do_NetQueryDisplayInformation( const wchar_t *server, int level )
{
      void *buf;
      NET_DISPLAY_USER *ndu;
      NET_DISPLAY_MACHINE *ndm;
      NET_DISPLAY_GROUP *ndg;
      DWORD read, next_index, rc, i;

      next_index = 0;
      do
      {
            buf = NULL;
            rc = NetQueryDisplayInformation( server, level, next_index, 10, 1024, &read, &buf );
            if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
                  break;

            printf( "\ngot %lu entries\n", read );

            switch ( level )
            {
                  case 1: // users
                        for ( i = 0, ndu = (NET_DISPLAY_USER *) buf; i < read; ++ i, ++ ndu )
                              print_user( ndu->usri1_name, ndu->usri1_flags );
                        // take the last element's next_index
                        if ( read > 0 )
                              next_index = ((NET_DISPLAY_USER *)buf)[read - 1].usri1_next_index;
                        break;
                  case 2: // machines
                        for ( i = 0, ndm = (NET_DISPLAY_MACHINE *) buf; i < read; ++ i, ++ ndm )
                              print_user( ndm->usri2_name, ndm->usri2_flags );
                        // take the last element's next_index
                        if ( read > 0 )
                              next_index = ((NET_DISPLAY_MACHINE *)buf)[read - 1].usri2_next_index;
                        break;
                  case 3: // groups
                        for ( i = 0, ndg = (NET_DISPLAY_GROUP *) buf; i < read; ++ i, ++ ndg )
                              printf( "%-40.40S (group)\n", ndg->grpi3_name );
                        // take the last element's next_index
                        if ( read > 0 )
                              next_index = ((NET_DISPLAY_GROUP *)buf)[read - 1].grpi3_next_index;
                        break;
            }

            if ( buf != NULL )
                  NetApiBufferFree( buf );

      } while ( rc == ERROR_MORE_DATA );

      if ( rc != ERROR_SUCCESS )
            printf( "NQDI() returned %lu\n", rc );
}



int main( void )
{
      // set this to \\your_domain_controller
      wchar_t *servername = L"\\\\BABYA";

      // get all accounts
      puts( "\n*** Enumerating accounts: NetUserEnum()" );
      do_NetUserEnum( servername );

      // get users
      puts( "\n*** Enumerating users: NetQueryDisplayInformation()" );
      do_NetQueryDisplayInformation( servername, 1 );

      // get machine accounts
      puts( "\n*** Enumerating machine accounts: NetQueryDisplayInformation()" );
      do_NetQueryDisplayInformation( servername, 2 );

      // get groups
      puts( "\n*** Enumerating groups: NetQueryDisplayInformation()" );
      do_NetQueryDisplayInformation( servername, 3 );

      return 0;
}




Display the logon sessions, use:


VOID DisplaySessionLogons( LPTSTR ServerName )
{
   LPSESSION_INFO_10 pBuf = NULL;
   LPSESSION_INFO_10 pTmpBuf;
   DWORD            dwLevel = 10;
   DWORD            dwPrefMaxLen = 0xFFFFFFFF;
   DWORD            dwEntriesRead = 0;
   DWORD            dwTotalEntries = 0;
   DWORD            dwResumeHandle = 0;
   DWORD            i;
   DWORD            dwTotalCount = 0;
   LPTSTR            pszClientName = NULL;
   LPTSTR            pszUserName = NULL;
   NET_API_STATUS nStatus;
   PSID                  sid;
   DWORD            sidSize, domainNameSize;
   BYTE                  sidBuffer[MAX_SID_SIZE];
   TCHAR            domainName[MAX_NAME_STRING];  
   SID_NAME_USE sidType;
   BOOLEAN            first = TRUE;

   //
   // Now display session logons
   //
   do
   {
      nStatus = NetSessionEnum(ServerName,
                               pszClientName,
                               pszUserName,
                               dwLevel,
                               (LPBYTE*)&pBuf,
                               dwPrefMaxLen,
                               &dwEntriesRead,
                               &dwTotalEntries,
                               &dwResumeHandle);

      if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
      {
         if ((pTmpBuf = pBuf) != NULL)
         {
            for (i = 0; (i < dwEntriesRead); i++)
            {
               assert(pTmpBuf != NULL);

               if (pTmpBuf == NULL)
               {
                  fprintf(stderr, "An access violation has occurred\n");
                  break;
               }

                     //
                     // Take the name and look up a SID so that we can get full domain/user
                     // information
                     //
                     sid = (PSID) sidBuffer;
                     sidSize = sizeof( sidBuffer );
                     domainNameSize = sizeof( domainName );

                     if( pTmpBuf->sesi10_username[0] ) {

                           if( first ) {
                                
                                    wprintf(L"\nUsers logged on via resource shares:\n");
                                    first = FALSE;
                           }
                           if( LookupAccountName( pTmpBuf->sesi10_cname ,
                                                            pTmpBuf->sesi10_username,
                                                            sid,
                                                            &sidSize,
                                                            domainName,
                                                            &domainNameSize,
                                                            &sidType )) {

                                 wprintf(L"     %s\\%s\n", domainName, pTmpBuf->sesi10_username );

                           } else {
                                    
                                wprintf(L"      %s\\%s\n", ServerName, pTmpBuf->sesi10_username );
                           }
                     }

               pTmpBuf++;
               dwTotalCount++;
            }
         }
      } else {

              wprintf(L"Unable to query resource logons\n");
              first = FALSE;
        }

      if (pBuf != NULL)
      {
         NetApiBufferFree(pBuf);
         pBuf = NULL;
      }
   }
   while (nStatus == ERROR_MORE_DATA);

   if (pBuf != NULL)
      NetApiBufferFree(pBuf);
      if( first ) wprintf(L"\nNo one is logged on via resource shares.\n");
}



The name of the logged on user can be found by calling 'GetUserName()'
0
 
jkrCommented:
Ooops, sorry, wrong browser window - please reject this...
0
 
jkrCommented:
jkr has changed their proposed answer to a comment
0
[Webinar] Kill tickets & tabs using PowerShell

Are you tired of cycling through the same browser tabs everyday to close the same repetitive tickets? In this webinar JumpCloud will show how you can leverage RESTful APIs to build your own PowerShell modules to kill tickets & tabs using the PowerShell command Invoke-RestMethod.

 
MadshiCommented:
Simple:

  threadID = GetWindowThreadProcessID(windowHandle, NULL);

Regards, Madshi.
0
 
telebasicsAuthor Commented:
Sounds good but i get an invalid use of NULL when i trie to get the treadID for sometrhing like the taskbar
0
 
MadshiCommented:
Well, I'm no C++ programmer. In Delphi it looks like "...(windowHandle, nil);". Which language are you using?
0
 
MadshiCommented:
Perhaps you have to do something like this?

  threadID = GetWindowThreadProcessID(windowHandle, (LPDWORD) NULL);

?
0
 
telebasicsAuthor Commented:
OK Using an other Null operater availible in basic it works
0

Featured Post

Learn to develop an Android App

Want to increase your earning potential in 2018? Pad your resume with app building experience. Learn how with this hands-on course.

  • 3
  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now