Subversion Repositories Aucun

Rev

Rev 218 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 ixe013 1
// test.cpp : Defines the entry point for the console application.
2
//
3
 
4
#include <windows.h>
40 ixe013 5
#include <wincred.h>
5 ixe013 6
#include <tchar.h>
7
#include <stdio.h>
40 ixe013 8
#include <security.h>
9
#include <lm.h>
133 ixe013 10
#include <sddl.h>
5 ixe013 11
#include "settings.h"
12
#include "unlockpolicy.h"
91 ixe013 13
#include "trace.h"
40 ixe013 14
#include "debug.h"
91 ixe013 15
#include "SecurityHelper.h"
216 ixe013 16
#include "global.h"
5 ixe013 17
 
121 ixe013 18
#include "randpasswd.h"
19
 
113 ixe013 20
#include "dlgdefs.h"
21
#include "loggedout_dlg.h"
15 ixe013 22
 
113 ixe013 23
INT_PTR CALLBACK DefDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
40 ixe013 24
 
133 ixe013 25
DialogAndProcs gDialogsProc[] =
113 ixe013 26
{
215 ixe013 27
    { IDD_LOGGED_OUT_SAS,  MyWlxWkstaLoggedOutSASDlgProc, DefDialogProc},
113 ixe013 28
};
40 ixe013 29
 
215 ixe013 30
const int nbDialogsAndProcs = sizeof gDialogsProc / sizeof * gDialogsProc;
113 ixe013 31
 
216 ixe013 32
static MyGinaContext gAucunContext = {0};
33
MyGinaContext* pgAucunContext = &gAucunContext;
113 ixe013 34
 
216 ixe013 35
 
107 ixe013 36
BOOL IsWindowsServer()
91 ixe013 37
{
215 ixe013 38
    OSVERSIONINFOEX osvi;
39
    DWORDLONG dwlConditionMask = 0;
40
    // Initialize the OSVERSIONINFOEX structure.
41
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
42
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
43
    osvi.dwMajorVersion = 5;
44
    osvi.wProductType = VER_NT_SERVER;
45
    // Initialize the condition mask.
46
    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
47
    VER_SET_CONDITION(dwlConditionMask, VER_PRODUCT_TYPE, VER_EQUAL);
48
    // Perform the test.
49
    return VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_PRODUCT_TYPE, dwlConditionMask);
91 ixe013 50
}
51
 
52
 
113 ixe013 53
// Message handler for about box.
54
INT_PTR CALLBACK DefDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
55
{
215 ixe013 56
    UNREFERENCED_PARAMETER(lParam);
113 ixe013 57
 
215 ixe013 58
    switch (message)
59
    {
60
        case WM_COMMAND:
113 ixe013 61
 
215 ixe013 62
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
63
            {
64
                EndDialog(hDlg, LOWORD(wParam));
65
                return (INT_PTR)TRUE;
66
            }
91 ixe013 67
 
215 ixe013 68
            break;
69
    }
91 ixe013 70
 
215 ixe013 71
    return (INT_PTR)FALSE;
72
}
160 ixe013 73
 
91 ixe013 74
 
215 ixe013 75
int _tmain(int argc, _TCHAR* argv[])
76
{
77
    int result = -1;
78
    HANDLE lsa = 0;
40 ixe013 79
 
219 ixe013 80
    TRACE(eINFO, L"Started\n");
81
 
215 ixe013 82
    //EnablePrivilege(L"SeTcbPrivilege");
83
    if (!RegisterLogonProcess(LOGON_PROCESS_NAME, &lsa))
84
    {
218 ixe013 85
        TRACE(eERROR, L"Process not registered 0x%0X", GetLastError());
215 ixe013 86
    }
40 ixe013 87
 
215 ixe013 88
    if (argc > 1) for (int i = 1; i < argc; ++i)
89
        {
90
            //  wchar_t user[MAX_USERNAME];
91
            //  wchar_t domain[MAX_DOMAIN];
92
            wchar_t passwd[MAX_PASSWORD];
93
            wchar_t username[512];
94
            wchar_t domain[512];
95
            HANDLE current_user = 0;
96
            OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &current_user);
218 ixe013 97
            GetUsernameAndDomainFromToken(current_user, domain, sizeof domain / sizeof * domain, username, sizeof username / sizeof * username);
98
            TOKEN_USER *tu = 0;
215 ixe013 99
            PSID sid1 = 0;
100
            PSID sid2 = 0;
218 ixe013 101
            GetSIDFromToken(current_user, &tu);
102
            sid1 = tu->User.Sid;
215 ixe013 103
            GetSIDFromUsername(argv[i], &sid2);
40 ixe013 104
 
215 ixe013 105
            if(sid1 && sid2 && EqualSid(sid1, sid2))
106
            {
218 ixe013 107
                TRACE(eINFO, L"Same SID\n");
215 ixe013 108
            }
40 ixe013 109
 
215 ixe013 110
            LPTSTR tsid = 0;
111
            ConvertSidToStringSid(sid1, &tsid);
218 ixe013 112
            wprintf(L"LogonSID : %s (%s)\n", tsid, username);
215 ixe013 113
            LocalFree(tsid);
114
            ConvertSidToStringSid(sid2, &tsid);
218 ixe013 115
            wprintf(L"User SID : %s (%s)\n", tsid, argv[i]);
215 ixe013 116
            LocalFree(tsid);
218 ixe013 117
            HeapFree(GetProcessHeap(), 0, tu);
215 ixe013 118
            HeapFree(GetProcessHeap(), 0, sid2);
133 ixe013 119
 
215 ixe013 120
            if (ShouldHookUnlockPasswordDialog(current_user))
121
            {
122
                TRACE(eERROR, L"Should hook.\n");
123
            }
133 ixe013 124
 
215 ixe013 125
            if (_getws_s(passwd, MAX_PASSWORD) == passwd)
126
            {
127
                result = ShouldUnlockForUser(lsa, current_user, domain, username, passwd);
133 ixe013 128
 
215 ixe013 129
                switch (result)
130
                {
131
                    case eLetMSGINAHandleIt:
132
                        TRACE(eERROR, L"TEST result is eLetMSGINAHandleIt\n");
133
                        wprintf(L"Actual result   : eLetMSGINAHandleIt\n");
134
                        break;
135
                    case eUnlock:
136
                        TRACE(eERROR, L"TEST result is eUnlock\n");
137
                        wprintf(L"Actual result   : eUnlock\n");
138
                        break;
139
                    case eForceLogoff:
140
                        TRACE(eERROR, L"TEST result is eForceLogoff\n");
141
                        wprintf(L"Actual result   : eForceLogoff\n");
142
                        break;
143
                }
144
            }
145
            else
107 ixe013 146
            {
215 ixe013 147
                TRACE(eERROR, L"Unable to read password\n");
148
                break;
107 ixe013 149
            }
91 ixe013 150
 
215 ixe013 151
            CloseHandle(current_user);
152
        }
153
    else
154
    {
155
        /*
156
        HMODULE msginadll = LoadLibraryEx(_T("msgina.dll"), 0, LOAD_LIBRARY_AS_DATAFILE);
91 ixe013 157
 
215 ixe013 158
        if (msginadll)
159
        {
160
          DialogBox(msginadll, MAKEINTRESOURCE(1500), 0, MyWlxWkstaLoggedOutSASDlgProc);
91 ixe013 161
 
215 ixe013 162
          FreeLibrary(msginadll);
163
          msginadll = 0;
164
        }
165
        /*/
166
        for(int i = 0; i < 125; ++i)
167
        {
168
            wchar_t buf[62];
169
            GenerateRandomUnicodePassword(buf, sizeof buf / sizeof * buf);
170
            wprintf(L"%s\n", buf);
171
        }
108 ixe013 172
 
215 ixe013 173
        //*/
174
    }
108 ixe013 175
 
215 ixe013 176
    if (lsa)
177
    {
178
        LsaDeregisterLogonProcess(lsa);
179
    }
180
 
181
    return result;
5 ixe013 182
}