bool CScannerNetBios::NullSession() { memset(&m_UseInfo, 0, sizeof(m_UseInfo)); m_UseInfo.ui2_local=NULL; m_UseInfo.ui2_remote=m_wszResource; m_UseInfo.ui2_password=L""; m_UseInfo.ui2_username=L""; m_UseInfo.ui2_domainname=L""; m_UseInfo.ui2_asg_type=USE_IPC; m_NetApiStatus=NetUseAdd(NULL, 2, (LPBYTE)&m_UseInfo, NULL); if(m_NetApiStatus==ERROR_SESSION_CREDENTIAL_CONFLICT) return true; if(m_NetApiStatus==NERR_Success) return true; else return false; }
bool CScannerNetBios::AuthSession(const char *user, const char *password) { memset(&m_UseInfo, 0, sizeof(m_UseInfo)); m_UseInfo.ui2_local=NULL; WCHAR wszUser[256], wszPassword[256]; MultiByteToWideChar(CP_ACP, 0, user, (int)strlen(user)+1, wszUser, (int)sizeof(wszUser)/(int)sizeof(wszUser[0])); MultiByteToWideChar(CP_ACP, 0, password, (int)strlen(password)+1, wszPassword, (int)sizeof(wszPassword)/(int)sizeof(wszPassword[0])); m_UseInfo.ui2_remote=m_wszResource; m_UseInfo.ui2_password=wszPassword; m_UseInfo.ui2_username=wszUser; m_UseInfo.ui2_domainname=L""; m_NetApiStatus=NetUseAdd(NULL, 2, (LPBYTE)&m_UseInfo, NULL); if(m_NetApiStatus==ERROR_SESSION_CREDENTIAL_CONFLICT) return true; if(m_NetApiStatus==NERR_Success) return true; else return false; }
/***************************************************************************** SetupNormalSession *****************************************************************************/ APIERR SetupNormalSession( const TCHAR * pszServer ) { APIERR err; TCHAR szShare[MAX_PATH]; USE_INFO_1 ui1; strcpyf( szShare, pszServer ); strcatf( szShare, SZ("\\IPC$") ); ui1.ui1_local = NULL; ui1.ui1_remote = (LPTSTR)szShare; ui1.ui1_password = NULL; ui1.ui1_asg_type = USE_IPC; err = NetUseAdd( NULL, 1, (LPBYTE)&ui1, NULL ); return err; } // SetupNormalSession
DWORD DfspSetupNullSession( LPWSTR wszDCName) { DWORD dwErr; USE_INFO_2 ui2; LPWSTR wszDCIPCShare; wszDCIPCShare = (LPWSTR) malloc( wcslen(wszDCName) * sizeof(WCHAR) + sizeof(ROOT_SHARE_NAME)); if (wszDCIPCShare != NULL) { wcscpy( wszDCIPCShare, wszDCName ); wcscat( wszDCIPCShare, ROOT_SHARE_NAME ); ui2.ui2_local = NULL; ui2.ui2_remote = wszDCIPCShare; ui2.ui2_password = L""; ui2.ui2_asg_type = USE_IPC; ui2.ui2_username = L""; ui2.ui2_domainname = L""; dwErr = NetUseAdd( NULL, 2, (LPBYTE) &ui2, NULL ); free( wszDCIPCShare ); } else { dwErr = ERROR_NOT_ENOUGH_MEMORY; } return( dwErr ); }
// @pymethod |win32net|NetUseAdd|Establishes connection between local or NULL device name and a shared resource through redirector PyObject * PyNetUseAdd(PyObject *self, PyObject *args) { WCHAR *szServer = NULL; PyObject *obServer, *obData; PyNET_STRUCT *pInfo; BYTE *buf = NULL; PyObject *ret = NULL; DWORD level; DWORD err = 0; // @pyparm string/<o PyUnicode>|server||The name of the server, or None. // @pyparm int|level||The information level contained in the data // @pyparm mapping|data||A dictionary holding the share data in the format of <o PyUSE_INFO_*>. if (!PyArg_ParseTuple(args, "OiO", &obServer, &level, &obData)) return NULL; if (!PyWinObject_AsWCHAR(obServer, &szServer, TRUE)) goto done; if (!FindNET_STRUCT(level, use_infos, &pInfo)) goto done; if (!PyObject_AsNET_STRUCT(obData, pInfo, &buf)) goto done; err = NetUseAdd(szServer, level, buf, NULL); if (err) { ReturnNetError("NetUseAdd",err); goto done; } ret= Py_None; Py_INCREF(ret); done: if (buf) PyObject_FreeNET_STRUCT(pInfo, buf); PyWinObject_FreeWCHAR(szServer); return ret; // @pyseeapi NetUseAdd }
/***************************************************************************** SetupNullSession *****************************************************************************/ APIERR SetupNullSession( const TCHAR * pszServer ) { APIERR err; TCHAR szShare[MAX_PATH]; USE_INFO_2 ui2; strcpyf( szShare, pszServer ); strcatf( szShare, SZ("\\IPC$") ); ui2.ui2_local = NULL; ui2.ui2_remote = (LPTSTR)szShare; ui2.ui2_password = (LPTSTR)L""; ui2.ui2_asg_type = USE_IPC; ui2.ui2_username = (LPTSTR)L""; ui2.ui2_domainname = (LPTSTR)L""; err = NetUseAdd( NULL, 2, (LPBYTE)&ui2, NULL ); return err; } // SetupNullSession
ActivePet::ActivePet(wchar_t* user_password, std::wstring petname, FileEventLoop* files) : m_petname(petname), m_files(files), m_session(INVALID_HANDLE_VALUE), m_profile(INVALID_HANDLE_VALUE), m_job(CreateJobObject(NULL, NULL)), m_next_editable_name(1), m_ticks_while_invisible(0) { // Create a new logon session for the pet. std::wstring petRegistryPath = Constants::registryPets() + L"\\" + m_petname; RegKey petkey = RegKey::HKCU.open(petRegistryPath); std::wstring accountName = petkey.getValue(L"accountName"); std::wstring accountRegistryPath = Constants::registryAccounts() + L"\\" + accountName; RegKey accountKey = RegKey::HKCU.open(accountRegistryPath); std::wstring password = accountKey.getValue(L"password"); if (!LogonUser(accountName.c_str(), NULL, password.c_str(), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &m_session)) { printf("LogonUser() failed: %d\n", GetLastError()); return; } // Tweak the Winsta0 and desktop ACLs to allow the pet to create windows. auto_buffer<PSID> logon_sid = GetLogonSID(m_session.get()); if (NULL == logon_sid.get()) { return; } auto_close<HWINSTA, &::CloseWindowStation> winsta0(OpenWindowStation(L"winsta0", FALSE, READ_CONTROL | WRITE_DAC)); if (NULL == winsta0.get()) { printf("OpenWindowStation() failed: %d\n", GetLastError()); return; } if (!AddAceToWindowStation(winsta0.get(), logon_sid.get())) { printf("AddAceToWindowStation() failed: %d", GetLastError()); return; } auto_close<HDESK, &::CloseDesktop> desktop(OpenDesktop(L"default", 0, FALSE, READ_CONTROL | WRITE_DAC | DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS)); if (NULL == desktop.get()) { printf("OpenDesktop() failed: %d\n", GetLastError()); return; } if (!AddAceToDesktop(desktop.get(), logon_sid.get())) { printf("AddAceToDesktop() failed: %d\n", GetLastError()); return; } // Load the pet account's registry hive. wchar_t account[128] = {}; wcsncpy(account, accountName.c_str(), 128); PROFILEINFO profile = { sizeof(PROFILEINFO), 0, account }; if (!LoadUserProfile(m_session.get(), &profile)) { printf("LoadUserProfile() failed: %d\n", GetLastError()); return; } m_profile = profile.hProfile; // Initialize the pet job. if (NULL == m_job.get()) { printf("CreateJobObject() failed: %d\n", GetLastError()); return; } JOBOBJECT_BASIC_UI_RESTRICTIONS buir = { JOB_OBJECT_UILIMIT_HANDLES }; if (!SetInformationJobObject(m_job.get(), JobObjectBasicUIRestrictions, &buir, sizeof buir)) { printf("SetInformationJobObject() failed: %d\n", GetLastError()); } // Some apps fail to launch without access to the desktop window. if (!UserHandleGrantAccess(GetDesktopWindow(), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } // Give apps access to all the standard cursors. if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_ARROW), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_IBEAM), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_WAIT), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_CROSS), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_UPARROW), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_SIZE), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_ICON), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_SIZENWSE), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_SIZENESW), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_SIZEWE), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_SIZENS), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_SIZEALL), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_NO), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_HAND), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_APPSTARTING), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } if (!UserHandleGrantAccess(LoadCursor(NULL, IDC_HELP), m_job.get(), TRUE)) { printf("UserHandleGrantAccess() failed: %d\n", GetLastError()); } // Setup the use records for the printers. std::set<std::wstring> servers; RegKey printers = RegKey::HKCU.open(L"Printers\\Connections"); for (int i = 0; true; ++i) { RegKey printer = printers.getSubKey(i); if (!printer.isGood()) { break; } std::wstring server = printer.getValue(L"Server"); if (servers.count(server) == 0) { std::wstring resource = server + L"\\IPC$"; auto_array<wchar_t> remote(resource.length() + 1); lstrcpy(remote.get(), resource.c_str()); USE_INFO_2 use = {}; use.ui2_remote = remote.get(); use.ui2_domainname = _wgetenv(L"USERDOMAIN"); use.ui2_username = _wgetenv(L"USERNAME");; use.ui2_password = user_password; use.ui2_asg_type = USE_WILDCARD; auto_impersonation impersonate(m_session.get()); DWORD arg_error; NET_API_STATUS error = NetUseAdd(NULL, 2, (BYTE*)&use, &arg_error); if (error) { printf("NetUseAdd() failed: %d\n", error); } else { servers.insert(server); } } } // Add the message handlers. //m_requestFolderPath = accountKey.getValue(Constants::petDataPathName()) + Constants::requestPath(); m_requestFolderPath = Constants::requestsPath(Constants::polarisDataPath(Constants::userProfilePath(accountName))); m_dispatcher = new MessageDispatcher(m_requestFolderPath); m_files->watch(m_requestFolderPath, m_dispatcher); m_dispatcher->add("sendmail",makeSendMailHandler()); // TODO m_dispatcher->add("GetOpenFileNameA", makeGetOpenFileNameAHandler(this)); m_dispatcher->add("GetOpenFileNameW", makeGetOpenFileNameWHandler(this)); m_dispatcher->add("GetClipboardData", makeGetClipboardDataHandler()); }