Cuestión : WTSGetActiveConsoleSessionId y Windows 2000

Hola, el

Iam usar WTSGetActiveConsoleSessionId y otras funciones a conseguir los usuarios consuelan el símbolo y después funcionan con proceso en su espacio de los usuarios. ¿Hay funcionalidad similary en Windows 2000? msdn del

In veo que WTSGetActiveConsoleSessionId es de Windows Xp y del servidor 2003
de Windows class= del

Respuesta : WTSGetActiveConsoleSessionId y Windows 2000

No, los requisitos indican claramente Xp como la versión prevista mínimo de Windows. Si usted quiere ejecutar un uso en el contexto del usuario abierto una sesión, usted puede utilizar el código siguiente, ve también http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Windows/Q_25282045.html
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
#include  
#include  
#include  
#include  
#include  

comentario del #pragma (liberación, “kernel32.lib”)
comentario del #pragma (liberación, “user32.lib”)
comentario del #pragma (liberación, “advapi32.lib”)

vacío
__cdecl
DbgReport (__pszFormat del char*,…) {

    s_acBuf estático del carbón de leña [2048];

    _args del va_list;

    va_start (_args, __pszFormat);

    vsprintf (s_acBuf, __pszFormat, _args);

    OutputDebugStringA (s_acBuf);

    va_end (_args);
}

DWORD ExecuteCmd   (   el pszCmd   de LPSTR, bShow de BOOL, MANIJA hToken)
{
    STARTUPINFO         si;
    PROCESS_INFORMATION pi;

    bRes                de BOOL;

    dwCode               de DWORD  =   0;

    Msg                de los MSG;

    ZeroMemory  (   &si,     sizeof  (   STARTUPINFO));

    si.cb           =   sizeof  (   STARTUPINFO);
    si.dwFlags      =   STARTF_USESHOWWINDOW;
    ¿si.wShowWindow  =   bShow? SW_SHOWNORMAL: SW_HIDE;

    bRes    =   CreateProcessAsUser   (  hToken,
                                   ANULAR,
                                   pszCmd,
                                   FALTA DE INFORMACIÓN,
                                   FALTA DE INFORMACIÓN,
                                   VERDAD,
                                   NORMAL_PRIORITY_CLASS,
                                   FALTA DE INFORMACIÓN,
                                   FALTA DE INFORMACIÓN,
                                   &si,
                                   π
                               );

    
    CloseHandle (   pi.hProcess);
    CloseHandle (   pi.hThread);

    vuelta  (   0);
}


DWORD GetExplorerProcessID ()
{
      hSnapshot de la MANIJA;
      PROCESSENTRY32 pe32;
      ZeroMemory (&pe32, sizeof (pe32));
      Temp de DWORD;

    hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, FALTA DE INFORMACIÓN);
      
      pe32.dwSize = sizeof (PROCESSENTRY32);

      si (Process32First (hSnapshot, &pe32))
      {
            hacer
            {
                  ¡si (! strcmp (pe32.szExeFile, “explorer.exe”))
                  {
                        temp = pe32.th32ProcessID;
                        rotura;
                  }

            } mientras que (Process32Next (hSnapshot, &pe32));
      }

    DbgReport (“explorador PID: %d \ n”, temp);

temp de vuelta;
}

BOOL EnableDebugPriv  (   BOOL    bEnable)
{
   La MANIJA           hToken;
   TOKEN_PRIVILEGES tp;

   ¡si   (   ! OpenProcessToken   (   GetCurrentProcess   (),
                                    TOKEN_ADJUST_PRIVILEGES,
                                    &hToken
                                )
        )   vuelta  (   FALSA);


   tp.PrivilegeCount    =   1;

   LookupPrivilegeValue (   FALTA DE INFORMACIÓN,
                            SE_DEBUG_NAME,
                            &tp. Privilegios  [   0]. Luid
                        );

   tp. Privilegios    [   0]. Cualidades   =       bEnable
                                            ¿?   SE_PRIVILEGE_ENABLED
                                            :   0;

   AdjustTokenPrivileges    (   hToken,
                                FALSO,
                                &tp,
                                sizeof  (   tp),
                                FALTA DE INFORMACIÓN,
                                FALTA DE INFORMACIÓN
                            );

   volver   ==   ERROR_SUCCESS (de GetLastError  (   ));
}

anular GetSidUser (el PSID psid, char*pName, DWORD dwNameSize) {

    socarrar                    el acReferencedDomain  [   LM20_DNLEN  +   1];
    DWORD                   dwDomainBufSize     =   sizeof  (   acReferencedDomain);
    eUse            de SID_NAME_USE;

               nombre  del texto claro de las operaciones de búsqueda de // del dueño
                ¡si  (   ! LookupAccountSid   (   FALTA DE INFORMACIÓN,
                                                psid,
                                                pName,
                                                &dwNameSize,
                                                acReferencedDomain,
                                                &dwDomainBufSize,
                                                &eUse
                                            )
                    )
                    {
                        dwErr =   GetLastError   de DWORD    ();

                        DbgReport (“LookupAccountSid () falló: %d \ n”, dwErr);

                    } DbgReport otro (el “Sid representa \ \ %s \ n”, acReferencedDomain, pName de %s);
}

ImpersonateInteractiveUser vacío (pCmd de LPSTR, bShow de BOOL)
{
   La MANIJA hToken = FALTA DE INFORMACIÓN;                
   hProcess = FALTA DE INFORMACIÓN de la MANIJA;
   acName                    del carbón de leña  [   LM20_DNLEN  +   1];
   DWORD                   dwNameSize     =   sizeof  (   acName);

   processID = GetExplorerProcessID de DWORD ();
   si (processID)
    {
    hProcess =
         OpenProcess (  
               PROCESS_ALL_ACCESS,
         VERDAD,
          processID);

    si (hProcess)
        {
        si (OpenProcessToken (
                    hProcess,
             TOKEN_ALL_ACCESS,
             &hToken))
        {
         Ptu de TOKEN_USER*;
         Dw de DWORD;
         GetTokenInformation (hToken, TokenUser, FALTA DE INFORMACIÓN, 0, &dw);
         ptu = _alloca (TOKEN_USER*) (dw);

         ¡si (! GetTokenInformation (hToken, TokenUser, ptu, dw, el &dw)) DbgReport (“GetTokenInformation () falló, razón: %d \ n”, GetLastError ());
         GetSidUser (ptu->User.Sid, acName, dwNameSize);

         ¡si (! ImpersonateLoggedOnUser (hToken)) DbgReport (“ImpersonateLoggedOnUser () falló, razón: %d \ n”, GetLastError ());

         DbgReport (de “comando lanzamiento: como \ “de %s %s \” \ n ", pCmd, acName);
         ExecuteCmd (el pCmd, bShow, hToken);

          CloseHandle (hToken);
        } DbgReport otro (“OpenProcessToken () falló, razón: %d \ n”, GetLastError ());
        CloseHandle (hProcess);
    } DbgReport otro (“OpenProcess () falló, razón: %d \ n”, GetLastError ());
   } 
}


cañería de la internacional (argc de la internacional, carbón de leña ** argv) {

  si (2 > argc) vuelta -1;

  EnableDebugPriv (VERDAD);

  El bShow de BOOL = VERDAD;

  si (bShow del == del argc 3) = strcmp (argv [2], “/HIDE”);

  ImpersonateInteractiveUser (argv [1], bShow);

  vuelta 0;

}
Otras soluciones  
 
programming4us programming4us