Frage : WTSGetActiveConsoleSessionId und Windows 2000

Hallo,

Iam using WTSGetActiveConsoleSessionId und andere Funktionen zum zu erhalten trösten Benutzer Zeichen und lassen dann Prozess in seinem Benutzerraum laufen. Gibt es similary Funktionalität im Windows 2000?

In msdn sehe ich, dass WTSGetActiveConsoleSessionId von Windows Xp und vom Windows-Server 2003
ist

Antwort : WTSGetActiveConsoleSessionId und Windows 2000

Nicht geben die Anforderungen offenbar Xp als die Minimum erwartete Windows-Version an. Wenn Sie eine Anwendung im Rahmen des angemeldeten Benutzers durchführen möchten, können Sie den folgenden Code verwenden, sehen auch 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:
6:
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  

#pragma Anmerkung (Bibliothek, „kernel32.lib“)
#pragma Anmerkung (Bibliothek, „user32.lib“)
#pragma Anmerkung (Bibliothek, „advapi32.lib“)

Lücke
__cdecl
DbgReport (char* __pszFormat,…) {

    statisches Putzfrau s_acBuf [2048];

    va_list _args;

    va_start (_args, __pszFormat);

    vsprintf (s_acBuf, __pszFormat, _args);

    OutputDebugStringA (s_acBuf);

    va_end (_args);
}

DWORD ExecuteCmd   (   LPSTR   pszCmd, BOOL bShow, HANDGRIFF hToken)
{
    STARTUPINFO         si;
    PROCESS_INFORMATION PU;

    BOOL                bRes;

    DWORD               dwCode  =   0;

    MSG                Msg;

    ZeroMemory  (   &si,     sizeof  (   STARTUPINFO));

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

    bRes    =   CreateProcessAsUser   (  hToken,
                                   NULL,
                                   pszCmd,
                                   NULL,
                                   NULL,
                                   ZUTREFFEND,
                                   NORMAL_PRIORITY_CLASS,
                                   NULL,
                                   NULL,
                                   &si,
                                   π
                               );

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

    Rückkehr  (   0);
}


DWORD GetExplorerProcessID ()
{
      HANDGRIFF hSnapshot;
      PROCESSENTRY32 pe32;
      ZeroMemory (&pe32, sizeof (pe32));
      DWORD Temp;

    hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, NULL);
      
      pe32.dwSize = sizeof (PROCESSENTRY32);

      wenn (Process32First (hSnapshot, &pe32))
      {
            tun
            {
                  wenn (! strcmp (pe32.szExeFile, „explorer.exe“))
                  {
                        Temp = pe32.th32ProcessID;
                        Bruch;
                  }

            } während (Process32Next (hSnapshot, &pe32));
      }

    DbgReport („Forscher PID: %d \ n“, Temp);

Rückholtemp;
}

BOOL EnableDebugPriv  (   BOOL    bEnable)
{
   HANDGRIFF           hToken;
   TOKEN_PRIVILEGES TP;

   wenn   (   ! OpenProcessToken   (   GetCurrentProcess   (),
                                    TOKEN_ADJUST_PRIVILEGES,
                                    &hToken
                                )
        )   Rückkehr  (   FALSCH);


   tp.PrivilegeCount    =   1;

   LookupPrivilegeValue (   NULL,
                            SE_DEBUG_NAME,
                            &tp. Privilegien  [   0]. Luid
                        );

   TP. Privilegien    [   0]. Attribute   =       bEnable
                                            ?   SE_PRIVILEGE_ENABLED
                                            :   0;

   AdjustTokenPrivileges    (   hToken,
                                FALSCH,
                                &tp,
                                sizeof  (   TP),
                                NULL,
                                NULL
                            );

   zurückgehen   (   GetLastError ()  ==   ERROR_SUCCESS);
}

GetSidUser aufheben (Psid Psid, char*pName, DWORD dwNameSize) {

    acReferencedDomain                    verkohlen  [   LM20_DNLEN  +   1];
    DWORD                   dwDomainBufSize     =   sizeof  (   acReferencedDomain);
    SID_NAME_USE            eUse;

               Name  des freien Textes des //-Nachschlagens des Inhabers
                wenn  (   ! LookupAccountSid   (   NULL,
                                                Psid,
                                                pName,
                                                &dwNameSize,
                                                acReferencedDomain,
                                                &dwDomainBufSize,
                                                &eUse
                                            )
                    )
                    {
                        DWORD dwErr   =   GetLastError    ();

                        DbgReport („LookupAccountSid () fiel aus: %d \ n“, dwErr);

                    } sonst DbgReport („SID stellt %s \ \ %s \ n“, acReferencedDomain, pName dar);
}

leeres ImpersonateInteractiveUser (LPSTR pCmd, BOOL bShow)
{
   HANDGRIFF hToken = NULL;                
   HANDGRIFF-hProcess = NULL;
   Putzfrau                    acName  [   LM20_DNLEN  +   1];
   DWORD                   dwNameSize     =   sizeof  (   acName);

   DWORD processID = GetExplorerProcessID ();
   wenn (processID)
    {
    hProcess =
         OpenProcess (  
               PROCESS_ALL_ACCESS,
         ZUTREFFEND,
          processID);

    wenn (hProcess)
        {
        wenn (OpenProcessToken (
                    hProcess,
             TOKEN_ALL_ACCESS,
             &hToken))
        {
         TOKEN_USER* ptu;
         DWORD dw;
         GetTokenInformation (, TokenUser, NULL, 0, &dw hToken);
         ptu = _alloca (TOKEN_USER*) (dw);

         wenn (! GetTokenInformation (, TokenUser, ptu, dw, &dw hToken)) DbgReport („GetTokenInformation () fiel, Grund aus: %d \ n“, GetLastError ());
         GetSidUser (ptu->User.Sid, acName, dwNameSize);

         wenn (! ImpersonateLoggedOnUser (hToken)) DbgReport („ImpersonateLoggedOnUser () fiel, Grund aus: %d \ n“, GetLastError ());

         DbgReport („startender Befehl: %s wie \ „%s \“ \ n ", pCmd, acName);
         ExecuteCmd (pCmd, bShow, hToken);

          CloseHandle (hToken);
        } sonst DbgReport („OpenProcessToken () fiel, Grund aus: %d \ n“, GetLastError ());
        CloseHandle (hProcess);
    } sonst DbgReport („OpenProcess () fiel, Grund aus: %d \ n“, GetLastError ());
   } 
}


int-Hauptleitung (int argc, Putzfrau ** argv) {

  wenn (2 > argc) Rückkehr -1;

  EnableDebugPriv (ZUTREFFEND);

  BOOL bShow = RICHTEN aus;

  wenn (argc == 3) bShow = strcmp (argv [2], „/HIDE“);

  ImpersonateInteractiveUser (argv [1], bShow);

  Rückkehr 0;

}
Weitere Lösungen  
 
programming4us programming4us