DWORD DfspValidateDomainShare( LPWSTR wszDomain, LPWSTR wszShare, PUNICODE_STRING rgustrDCNames, DWORD cDCs) { DWORD i; NET_API_STATUS netStatus; PSHARE_INFO_1005 pSHI1005; BOOLEAN isDfs; for (i = 0; i < cDCs; i++) { netStatus = NetShareGetInfo( rgustrDCNames[i].Buffer, wszShare, 1005, (PBYTE *) &pSHI1005); if (netStatus == ERROR_SUCCESS) { isDfs = ((pSHI1005->shi1005_flags & SHI1005_FLAGS_DFS) != 0); NetApiBufferFree( pSHI1005 ); if (isDfs) { return( ERROR_SUCCESS ); } else { return( ERROR_FILE_NOT_FOUND ); } } else if (netStatus == NERR_NetNameNotFound) { return( ERROR_FILE_NOT_FOUND ); } } return( ERROR_FILE_NOT_FOUND ); }
bool GetPhysicalPathForShare(char* szServer, char* lpszShare, char** lpszPhysicalPath, int nBufferSize) { PSHARE_INFO_502 BufPtr; NET_API_STATUS res; wchar_t share[MAX_PATH]; wchar_t server[MAX_PATH]; char szTemp[MAX_PATH]; char szServerWithSlashes[MAX_PATH]; bool bRet = false; ::ZeroMemory(server, MAX_PATH); ::ZeroMemory(share, MAX_PATH); ::ZeroMemory(szServerWithSlashes, MAX_PATH); ::ZeroMemory(*lpszPhysicalPath, nBufferSize); _snprintf(szServerWithSlashes, MAX_PATH, "%s", szServer); mbstowcs(server, szServerWithSlashes, strlen(szServerWithSlashes)); mbstowcs(share, lpszShare, strlen(lpszShare)); // Try to get share information res = NetShareGetInfo(server, share, 502, (LPBYTE*)&BufPtr); if(res == ERROR_SUCCESS) { // It is assumed that we've already tested for whether we can write to this share ::ZeroMemory(szTemp, MAX_PATH); wcstombs(szTemp, (LPWSTR)(BufPtr->shi502_netname), MAX_PATH); // Copy the physical path to the out variable wcstombs(szTemp, (LPWSTR)(BufPtr->shi502_path), MAX_PATH); strncpy(*lpszPhysicalPath, szTemp, nBufferSize); bRet = true; NetApiBufferFree(BufPtr); return bRet; } else { printf("GetPhysicalPathForShare returned an error of %ld, are you sure the share you specified exists?\n", res); } return false; }
/** * Resolves UNC path to local (full) path if possible. * * @param InUNCPath UNC path to resolve * * @param OutPath Resolved local path * * @return true if the path was resolved, false otherwise */ bool FWindowsPlatformProcess::ResolveNetworkPath( FString InUNCPath, FString& OutPath ) { // Get local machine name first and check if this UNC path points to local share // (if it's not UNC path it will also fail this check) uint32 ComputerNameSize = MAX_COMPUTERNAME_LENGTH; TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 3] = { '\\', '\\', '\0', }; if ( GetComputerName( ComputerName + 2, (::DWORD*)&ComputerNameSize ) ) { // Check if the filename is pointing to local shared folder if ( InUNCPath.StartsWith( ComputerName ) ) { // Get the share name (it's the first folder after the computer name) int32 ComputerNameLen = FCString::Strlen( ComputerName ); int32 ShareNameLen = InUNCPath.Find( TEXT( "\\" ), ESearchCase::CaseSensitive, ESearchDir::FromStart, ComputerNameLen + 1 ) - ComputerNameLen - 1; FString ShareName = InUNCPath.Mid( ComputerNameLen + 1, ShareNameLen ); // NetShareGetInfo doesn't accept const TCHAR* as the share name so copy to temp array SHARE_INFO_2* BufPtr = NULL; ::NET_API_STATUS res; TCHAR ShareNamePtr[MAX_PATH]; FCString::Strcpy(ShareNamePtr, ShareName.Len() + 1, *ShareName); // Call the NetShareGetInfo function, specifying level 2 if ( ( res = NetShareGetInfo( NULL, ShareNamePtr, 2, (LPBYTE*)&BufPtr ) ) == ERROR_SUCCESS ) { // Construct the local path OutPath = FString( BufPtr->shi2_path ) + InUNCPath.Mid( ComputerNameLen + 1 + ShareNameLen ); // Free the buffer allocated by NetShareGetInfo NetApiBufferFree(BufPtr); return true; } } } // InUNCPath is not an UNC path or it's not pointing to local folder or something went wrong in NetShareGetInfo (insufficient privileges?) return false; }
static DWORD GetInfo( int argc, char** ppszArgv ) { static const DWORD dwLevel = 502; DWORD dwError = 0; PSHARE_INFO_502 pShareInfo = NULL; PWSTR pwszShareName = NULL; dwError = LwMbsToWc16s(ppszArgv[1], &pwszShareName); BAIL_ON_SRVSVC_ERROR(dwError); dwError = NetShareGetInfo( gState.pwszServerName, pwszShareName, dwLevel, OUT_PPVOID(&pShareInfo)); BAIL_ON_SRVSVC_ERROR(dwError); dwError = DumpShareInfo(pShareInfo); BAIL_ON_SRVSVC_ERROR(dwError); cleanup: if (pShareInfo) { SrvSvcFreeMemory(pShareInfo); } LW_SAFE_FREE_MEMORY(pwszShareName); return dwError; error: goto cleanup; }
PCBYTE CNetShare::GetInfo( PCWSTR pszServer, PCWSTR pszShare, ULONG ulLevel ) { if(!pszShare) { wprintf(L"Не заданно имя общедоступного ресурса"); return NULL; } PBYTE pData = NULL; ULONG ulResult = NetShareGetInfo(const_cast<PWSTR>(pszServer), const_cast<PWSTR>(pszShare), ulLevel, reinterpret_cast<LPBYTE *>(&pData)); if(NERR_Success != ulResult) { wprintf(L"Error: NetShareGetInfo() 0X%08x\n", ulResult); return NULL; } return pData; }
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. char szDate[30] = {0}, szDateTime[30] = {0}, szTemp[_MAX_PATH] = {0}, szApplicationLog[_MAX_PATH] = {0}; try { char *ptr = NULL, *ptr1 = NULL, szBexRegVerPath[_MAX_PATH] = {0}, szBexRegDataPath[_MAX_PATH] = {0}, szBexVerion[30] = {0}, szBexDataFilePath[_MAX_PATH] = {0}, szAppPath[_MAX_PATH] = {0}; Sleep(30*1000); memset(szBexRegVerPath, NULL, sizeof(szBexRegVerPath)); memset(szBexRegDataPath, NULL, sizeof(szBexRegDataPath)); memset(szBexVerion, NULL, sizeof(szBexVerion)); memset(szBexDataFilePath, NULL, sizeof(szBexDataFilePath)); memset(szTemp, NULL, sizeof(szTemp)); memset(szAppPath, NULL, sizeof(szAppPath)); memset(szApplicationLog, NULL, sizeof(szApplicationLog)); ::GetModuleFileName(NULL,szAppPath, sizeof(szAppPath)); ptr = strrchr(szAppPath, '\\'); if(ptr) { ptr++; *ptr = '\0'; } sprintf(szApplicationLog, "%s\\ApplicationLog\\BEXShare.log", szAppPath); //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tStarting Application BEX Share \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); CRegKey objReg; long lError = 0; bool bBackupInstalled = false; //////////////////////////////////////////////////////////////// //Read Reg ID char szRegID[100] = {0}, szLocalRegPath[MAX_PATH + 100] = {0}, *szError= NULL; DWORD dwBexVersn = 8; memset(szRegID, NULL, sizeof(szRegID)); memset(szLocalRegPath,0,sizeof(szLocalRegPath)); strcpy(szLocalRegPath,"SOFTWARE\\SAAZOD\0"); if(!ReadRegistryForLocalRegid(szLocalRegPath,szRegID, szError)) { memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tFailed Reading Local Registry %s. \r\n",szDateTime, szError); WriteToLog(szApplicationLog, szTemp); delete [] szError; szError = NULL; return 0; } //////////////////////////////////////////////////////////////// do { /* Checking for Symantec * Read Symantec Install Version 12.x */ DWORD dwCount = _MAX_PATH; lstrcpy(szBexRegVerPath, "SOFTWARE\\Symantec\\Backup Exec For Windows\\Backup Exec\\12.0\\Install"); lError = objReg.Open(HKEY_LOCAL_MACHINE, szBexRegVerPath, KEY_READ); if (ERROR_SUCCESS != lError) { lstrcpy(szBexRegVerPath, "SOFTWARE\\Symantec\\Backup Exec For Windows\\Backup Exec\\11.0\\Install"); lError = objReg.Open(HKEY_LOCAL_MACHINE, szBexRegVerPath, KEY_READ); } if (ERROR_SUCCESS != lError) { lstrcpy(szBexRegVerPath, "SOFTWARE\\Symantec\\Backup Exec For Windows\\Backup Exec\\Install"); lError = objReg.Open(HKEY_LOCAL_MACHINE, szBexRegVerPath, KEY_READ); } if(ERROR_SUCCESS == lError) { //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSuccessfully Opened Registry for Symantec :\r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); lError = objReg.QueryValue(dwBexVersn,"Major Version\0"); if(ERROR_SUCCESS == lError) { //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSymantec Version Installed [%d]:\r\n",szDateTime, dwBexVersn); WriteToLog(szApplicationLog, szTemp); bBackupInstalled = true; if (dwBexVersn > 8) { dwBexVersn = 9; } //Read Symantec Data Dir Path memset(szBexRegDataPath, NULL, sizeof(szBexRegDataPath)); lstrcpy(szBexRegDataPath, "SOFTWARE\\Symantec\\Backup Exec For Windows\\Backup Exec\\Engine\\Misc"); lError = objReg.Close(); lError = objReg.Open(HKEY_LOCAL_MACHINE, szBexRegDataPath, KEY_READ); lError = objReg.QueryValue(szBexDataFilePath,"Data Path\0",&dwCount); if(ERROR_SUCCESS == lError) { //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSymantec DataFilePath [%s]:\r\n",szDateTime, szBexDataFilePath); WriteToLog(szApplicationLog, szTemp); } else { //Symantec data file path not found //Log lError = objReg.Close(); memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSymantec Data File Path not Found. \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"SUCCESS\0", "Symantec Data File Path not Found.\0"); bBackupInstalled = false; //return 0; /// goto SRV; break; } lError = objReg.Close(); }//Query Value else { objReg.Close(); /* //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tTrying Symmantec Version 2nd Path :\r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); //Symmantec 2nd Path memset(szBexRegVerPath, NULL, sizeof(szBexRegVerPath)); lstrcpy(szBexRegVerPath, "SOFTWARE\\Symantec\\Backup Exec For Windows\\Backup Exec\\11.0\\Install"); lError = objReg.Open(HKEY_LOCAL_MACHINE, szBexRegVerPath, KEY_READ); if(ERROR_SUCCESS == lError) { //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSuccessfully Opened Registry for Symantec :\r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); lError = objReg.QueryValue(dwBexVersn,"Major Version\0"); if(ERROR_SUCCESS == lError) { //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSymantec Version Installed [%d]:\r\n",szDateTime, dwBexVersn); WriteToLog(szApplicationLog, szTemp); bBackupInstalled = true; if (dwBexVersn > 8) { dwBexVersn = 9; } //Read Symantec Data Dir Path memset(szBexRegDataPath, NULL, sizeof(szBexRegDataPath)); lstrcpy(szBexRegDataPath, "SOFTWARE\\Symantec\\Backup Exec For Windows\\Backup Exec\\Engine\\Misc"); lError = objReg.Close(); lError = objReg.Open(HKEY_LOCAL_MACHINE, szBexRegDataPath, KEY_READ); lError = objReg.QueryValue(szBexDataFilePath,"Data Path\0",&dwCount); if(ERROR_SUCCESS == lError) { //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSymantec DataFilePath [%s]:\r\n",szDateTime, szBexDataFilePath); WriteToLog(szApplicationLog, szTemp); } else { //Symantec data file path not found //Log lError = objReg.Close(); memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSymantec Data File Path not Found. \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"SUCCESS\0", "Symantec Data File Path not Found.\0"); bBackupInstalled = false; //return 0; // goto SRV; break; } lError = objReg.Close(); } else { //Log lError = objReg.Close(); bBackupInstalled = false; memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSymantec Version not Found. \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"SUCCESS\0", "Symantec Version not Found.\0"); //return 0; // goto SRV; break; } } */ //symantec over ///////////////////////////////////////////////////////////////////////////////////////////////////// } } else { //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSYMANTEC Path not found in registry. NOW LOOKING FOR VERITAS \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); // Checking for Symantec has failed // Now Checking for Veritas //Read Veritas Install Version lError = objReg.Close(); lstrcpy(szBexRegVerPath, "SOFTWARE\\VERITAS\\Backup Exec\\Install"); lError = objReg.Open(HKEY_LOCAL_MACHINE, szBexRegVerPath, KEY_READ); if(ERROR_SUCCESS == lError) { //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tSuccessfully Opened Registry for Veritas :\r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); lError = objReg.QueryValue(dwBexVersn,"Major Version\0"); if(ERROR_SUCCESS == lError) { //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tVeritas Version Installed [%d]:\r\n",szDateTime, dwBexVersn); WriteToLog(szApplicationLog, szTemp); if (dwBexVersn > 8) { dwBexVersn = 9; } //Read Veritas Data Dir Path lstrcpy(szBexRegDataPath, "SOFTWARE\\VERITAS\\Backup Exec\\Engine\\Misc"); lError = objReg.Close(); lError = objReg.Open(HKEY_LOCAL_MACHINE, szBexRegDataPath, KEY_READ); lError = objReg.QueryValue(szBexDataFilePath,"Data Path\0",&dwCount); if(ERROR_SUCCESS == lError) { bBackupInstalled = true; //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tVeritas DataFilePath [%s]:\r\n",szDateTime, szBexDataFilePath); WriteToLog(szApplicationLog, szTemp); } else { //Veritas data file path not found bBackupInstalled = false; //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tVeritas Data File Path not Found. \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"SUCCESS\0", "Veritas Data File Path not Found.\0"); //return 0; /// goto SRV; break; } lError = objReg.Close(); } else { objReg.Close(); //Log memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tVeritas Version could not be read from registry :\r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"SUCCESS\0", "Veritas Version could not be read from registry.\0"); //return 0; /// goto SRV; break; } } else { //Veritas path not found in registry lError = objReg.Close(); bBackupInstalled = false; memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tVeritas Path not Found in registry.\r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"SUCCESS\0", "Veritas Path not Found in registry.\0"); } } }while (0); ////////////////////////////////////////////////////////////////////////////////////////////////// memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tBefore Service Checking. [%d]\r\n",szDateTime, bBackupInstalled); WriteToLog(szApplicationLog, szTemp); if (false == bBackupInstalled) { //Checking Service Path memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tChecking Service. \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); char szPath[256] = {0}; memset(szPath, NULL, sizeof(szPath)); ServiceDetails(szPath); if (0 < lstrlen(szPath) ) { //Service Path memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tService Path [%s].\r\n",szDateTime, szPath); WriteToLog(szApplicationLog, szTemp); ptr = NULL; ptr1 = NULL; ptr1= szPath; ptr1++; ptr = strrchr(szPath, '\\'); memset(ptr+1, NULL, lstrlen(ptr+1)); lstrcat(ptr+1, "Data\0"); dwBexVersn = 9; memset(szBexDataFilePath, NULL, sizeof(szBexDataFilePath)); lstrcpy(szBexDataFilePath, ptr1); dwBexVersn = 9; bBackupInstalled = true; } else { memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tNo Symantec Software detected. Quitting !!!.\r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); } } ////////////////////////////////////////////////////////////////////////////////////////////////// if (false == bBackupInstalled) { GeneratePID(szRegID,"SUCCESS\0", "No veritas found.\0"); return 0; //GeneratePID(oThreadData->szRegId,"FAILED\0","Opening Last Parsed ini File Failed.\0"); } else { memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "Veritas Backup %d ", dwBexVersn); GeneratePID(szRegID,"SUCCESS\0", szTemp); } if (!(((8==dwBexVersn) || (9==dwBexVersn)) && (0 < lstrlen(szBexDataFilePath)))) { memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%s\tBex Version [%d]. Path [%s]. Quitting !!!.\r\n",szDateTime, szBexDataFilePath); WriteToLog(szApplicationLog, szTemp); return 0; } //Make the Bex Data Directory Shareable //Get Host Name char szHostName[100] = {0}; WSADATA wsData; WSAStartup(MAKEWORD( 2, 2 ),&wsData); ZeroMemory(szHostName, sizeof(szHostName)); gethostname(szHostName,sizeof(szHostName)); WSACleanup(); //Check For share // char // RemoteTerminalName[100] = {0}, // szPathName[_MAX_PATH] = {0}; // memset(szPathName, NULL, _MAX_PATH); // lstrcpy(szPathName, szBexDataFilePath); char * szPathC = NULL; wchar_t *str = NULL; char* szSortVal = NULL; szSortVal = new char[_MAX_PATH]; memset(szSortVal, NULL, _MAX_PATH); PSHARE_INFO_502 bufPtr; SHARE_INFO_502 info; NET_API_STATUS res = 0; memset(&info, NULL, sizeof(info)); //Share Name //sprintf(szSortVal, "%c$", szPathName[0]); sprintf(szSortVal, "zBEX%dX", dwBexVersn); //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tFinding Share Name [%s]:\r\n",szDateTime, szSortVal); WriteToLog(szApplicationLog, szTemp); // memset(RemoteTerminalName, NULL, 100); // sprintf(RemoteTerminalName,"\\\\%s", szHostName); // wchar_t *term = new wchar_t[(strlen(RemoteTerminalName)*2)+2]; // memset(term, NULL, strlen(RemoteTerminalName)*2 + 2); // swprintf(term, L"%S",RemoteTerminalName); wchar_t *name = new wchar_t[(strlen(szSortVal)*2)+2]; memset(name, NULL, strlen(szSortVal)*2 + 2); swprintf(name,L"%S",szSortVal); //check if share share exits if((res = NetShareGetInfo(NULL /*(LPTSTR)term*/, //local server (LPWSTR)name, //share name 502, (LPBYTE *) &bufPtr)) != ERROR_SUCCESS) { // Share does not exists //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tShare Name [%s] not found Return Value [%d]:\r\n", szDateTime, szSortVal, res); WriteToLog(szApplicationLog, szTemp); szPathC = new char[_MAX_PATH]; memset(szPathC, NULL, _MAX_PATH); sprintf(szPathC, "%s", szBexDataFilePath); info.shi502_netname = (LPWSTR)name; //ToWideChar(szSortVal); info.shi502_type = STYPE_SPECIAL; info.shi502_remark = NULL;//ToWideChar ("Hello"); info.shi502_permissions = ACCESS_ALL; info.shi502_max_uses = -1; info.shi502_path = (LPWSTR)ToWideChar(szPathC); info.shi502_passwd = NULL; res = NetShareAdd ( NULL,/*(LPTSTR)term,*/ // local 502, (LPBYTE)&info, NULL); if (0 == res) { //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tSuccessfully Created Share Name [%s]:\r\n",szDateTime, szSortVal); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"SUCCESS\0", "Share created.\0"); } else { //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tFailed Creating Share Name [%s]. Return Value [%d]:\r\n",szDateTime, szSortVal, res); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"FAILED\0", "Unable to create share.\0"); } } else { //Share Exists //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tShare Name [%s] already Exists. Return Value [%d] :\r\n",szDateTime, szSortVal, res); WriteToLog(szApplicationLog, szTemp); //Check that data path are same memset(szTemp, NULL, sizeof(szTemp)); sprintf(szTemp, "%S",bufPtr->shi502_path); if (stricmp(szTemp, szBexDataFilePath) ) { //Data path vary memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tShare Name is same but data path varies. Deleting Previous share and creating new share [%s] with path [%s]:\r\n",szDateTime, szSortVal, szBexDataFilePath); WriteToLog(szApplicationLog, szTemp); res = NetShareDel(NULL, (LPWSTR)name, NULL); if (0 == res) { szPathC = new char[_MAX_PATH]; memset(szPathC, NULL, _MAX_PATH); sprintf(szPathC, "%s", szBexDataFilePath); info.shi502_netname = (LPWSTR)name; //ToWideChar(szSortVal); info.shi502_type = STYPE_SPECIAL; info.shi502_remark = NULL;//ToWideChar ("Hello"); info.shi502_permissions = ACCESS_ALL; info.shi502_max_uses = -1; info.shi502_path = (LPWSTR)ToWideChar(szPathC); info.shi502_passwd = NULL; res = NetShareAdd ( NULL, 502, (LPBYTE)&info, NULL); } if (0 == res) { //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tSuccessfully Created Share Name [%s]:\r\n",szDateTime, szSortVal); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"SUCCESS\0", "Share created.\0"); } else { //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tFailed Creating Share Name [%s]. Return Value [%d]:\r\n",szDateTime, szSortVal, res); WriteToLog(szApplicationLog, szTemp); GeneratePID(szRegID,"FAILED\0", "Unable to create share.\0"); } } } res = NetApiBufferFree((LPVOID)bufPtr); //Checking For Last Parsed ini //If not Present create it with Last Parsed time as SAAZOD Installed date //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tChecking for Last Parsed Ini File :\r\n", szDateTime); WriteToLog(szApplicationLog, szTemp); char szSAAZODRegPath[100] = {0}, szSAAZODInstallDate[25] = {0}, szSAAZODInstallPath[_MAX_PATH] = {0}, szInstallDate[50]= {0}; DWORD dwCount; memset(szSAAZODRegPath, 0, 100); lstrcpy(szSAAZODRegPath, "SOFTWARE\\SAAZOD"); memset(szSAAZODInstallDate, 0, 25); memset(szSAAZODInstallPath, 0, _MAX_PATH); memset(szInstallDate, 0, 50); lError = objReg.Open(HKEY_LOCAL_MACHINE, szSAAZODRegPath, KEY_READ); dwCount = 25; lError = objReg.QueryValue(szSAAZODInstallDate,"InstallDate\0",&dwCount); if (lError) { //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tError Opening SAAZOD Install Date in registry: \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); objReg.Close(); return 1; } lError = objReg.Close(); lError = objReg.Open(HKEY_LOCAL_MACHINE, szSAAZODRegPath, KEY_READ); if (lError) { //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tError Opening SAAZOD Install Date in registry:\r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); objReg.Close(); return 1; } dwCount = _MAX_PATH; lError = objReg.QueryValue(szSAAZODInstallPath, "InstallationPath\0",&dwCount); if (lError) { //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tError Opening SAAZOD Install Path in registry: \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); objReg.Close(); return 1; } lError = objReg.Close(); //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tSAAZOD Install Path [%s] SAAZOD Install Date [%s]: \r\n",szDateTime, szSAAZODInstallPath, szSAAZODInstallDate); WriteToLog(szApplicationLog, szTemp); lstrcat(szSAAZODInstallDate, "/"); char **arrValues = NULL; SplitString(szSAAZODInstallDate, "/", arrValues); sprintf(szInstallDate,"%s-%s-%s 00:00:00", arrValues[2], arrValues[0], arrValues[1]); HANDLE hIniCheck = NULL; char szLastParseIni[_MAX_PATH] = {0}; memset(szLastParseIni, NULL, _MAX_PATH); sprintf(szLastParseIni, "%s\\Configuration\\Bex%dx\\%s_LastParsed.ini", szSAAZODInstallPath, dwBexVersn, szHostName); hIniCheck = CreateFile(szLastParseIni, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(hIniCheck == INVALID_HANDLE_VALUE) { // memset(szTemp, 0, sizeof(szTemp)); // lstrcpy(szTemp, szLastParseIni); // memset(szLastParseIni, 0, sizeof(szLastParseIni)); // sprintf(szLastParseIni, "%s\\%s_LastParsed.ini", szTemp, szHostName); // Create Bex Directory char szConfigDirectory[_MAX_PATH] = {0}; memset(szConfigDirectory, NULL, _MAX_PATH); sprintf(szConfigDirectory, "%s\\Configuration\\Bex%dx\\", szSAAZODInstallPath, dwBexVersn); CreateDirectoriesRecursively(szConfigDirectory); DWORD dwBytesWritten = 0; hIniCheck = CreateFile(szLastParseIni, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL); WriteFile(hIniCheck, szInstallDate, strlen(szInstallDate), &dwBytesWritten, NULL); CloseHandle(hIniCheck); //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tCreated File [%s] with data [%s]: \r\n",szDateTime, szLastParseIni, szInstallDate); WriteToLog(szApplicationLog, szTemp); } else { //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tFile [%s] found : \r\n",szDateTime, szLastParseIni); WriteToLog(szApplicationLog, szTemp); CloseHandle(hIniCheck); hIniCheck = NULL; } } catch(...) { //Log memset(szDateTime, NULL, sizeof(szDateTime)); memset(szTemp, NULL, sizeof(szTemp)); GetDateTime(szDate,szDateTime); sprintf(szTemp, "%s\tException occured in main : \r\n",szDateTime); WriteToLog(szApplicationLog, szTemp); } return 0; }
/* ================ PFBYTE inBuf - The start of the incoming buffer (needed for offset calculations) PSMB_TRANSACTIONRQ pInReq - the incoming request PFBYTE outBuf - the outgoing buffer (needed for offset calculations) PSMB_TRANSACTIONRS pOutRes - The out going transaction response ================ */ int RAP_Proc (PSMB_SESSIONCTX pCtx, PRTSMB_HEADER pInHdr, PRTSMB_TRANSACTION pTransaction, PFVOID pInBuf, PRTSMB_HEADER pOutHdr, PRTSMB_TRANSACTION_R pTransactionR, rtsmb_size size_left) { RTSMB_RAP_REQUEST func; rtsmb_char param [50]; rtsmb_char answer [50]; int size, data_size = 0; word param_size; func.parent = pTransaction; func.parameter = param; func.parameter_size = 49; func.answer = answer; func.answer_size = 49; size = srv_cmd_read_rap_request (pCtx->read_origin, pInBuf, pCtx->current_body_size - (rtsmb_size)(PDIFF (pInBuf, pCtx->read_origin)), pInHdr, &func); if (size == -1) return 0; pInBuf = PADD (pInBuf, size); param_size = 0; switch (func.opcode) { case RAP_COM_NET_SHARE_ENUM: data_size = NetShareEnum (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_NET_SERVER_GETINFO: data_size = NetServerGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_NET_WKSTA_GETINFO: data_size = NetWkstaGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_NET_SHARE_GETINFO: data_size = NetShareGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_WPRINTQ_GETINFO: data_size = WPrintQGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_NET_SERVER_ENUM2: data_size = NetServerEnum2 (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; /* case RAP_COM_NET_ACCESS_GETINFO: NetAccessGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left); break;*/ default: RTSMB_DEBUG_OUTPUT_STR ("RAP_Proc: function unhandled: ", RTSMB_DEBUG_TYPE_ASCII); RTSMB_DEBUG_OUTPUT_INT (func.opcode); RTSMB_DEBUG_OUTPUT_STR ("\n", RTSMB_DEBUG_TYPE_ASCII); } if (data_size == -2) /* special error case where we don't want to answer */ return -1; pTransactionR->setup_size = 0; pTransactionR->setup = (PFWORD)0; pTransactionR->parameter = pCtx->tmpBuffer; pTransactionR->parameter_count = param_size; if (data_size == -1) { pTransactionR->data = (PFBYTE)0; pTransactionR->data_count = 0; } else { pTransactionR->data = PADD (pCtx->tmpBuffer, param_size); pTransactionR->data_count = (word) data_size; } return 0; } // End RAP_Proc
NET_API_STATUS netapitest_share(struct libnetapi_ctx *ctx, const char *hostname) { NET_API_STATUS status = 0; const char *sharename, *comment; uint8_t *buffer = NULL; struct SHARE_INFO_2 i2; struct SHARE_INFO_502 i502; struct SHARE_INFO_1004 i1004; struct SHARE_INFO_501 *i501 = NULL; uint32_t parm_err = 0; uint32_t levels[] = { 0, 1, 2, 501, 1005 }; uint32_t enum_levels[] = { 0, 1, 2 }; int i; printf("NetShare tests\n"); sharename = "torture_test_share"; /* cleanup */ NetShareDel(hostname, sharename, 0); /* add a share */ printf("testing NetShareAdd\n"); ZERO_STRUCT(i502); i502.shi502_netname = sharename; i502.shi502_path = "c:\\"; status = NetShareAdd(hostname, 502, (uint8_t *)&i502, &parm_err); if (status) { NETAPI_STATUS(ctx, status, "NetShareAdd"); goto out; }; status = NetShareDel(hostname, sharename, 0); if (status) { NETAPI_STATUS(ctx, status, "NetShareDel"); goto out; }; ZERO_STRUCT(i2); i2.shi2_netname = sharename; i2.shi2_path = "c:\\"; status = NetShareAdd(hostname, 2, (uint8_t *)&i2, &parm_err); if (status) { NETAPI_STATUS(ctx, status, "NetShareAdd"); goto out; }; /* test enum */ for (i=0; i<ARRAY_SIZE(enum_levels); i++) { status = test_netshareenum(hostname, enum_levels[i], sharename); if (status) { NETAPI_STATUS(ctx, status, "NetShareEnum"); goto out; } } /* basic queries */ for (i=0; i<ARRAY_SIZE(levels); i++) { printf("testing NetShareGetInfo level %d\n", levels[i]); status = NetShareGetInfo(hostname, sharename, levels[i], &buffer); if (status && status != 124) { NETAPI_STATUS(ctx, status, "NetShareGetInfo"); goto out; } } comment = "NetApi generated comment"; i1004.shi1004_remark = comment; printf("testing NetShareSetInfo level 1004\n"); status = NetShareSetInfo(hostname, sharename, 1004, (uint8_t *)&i1004, &parm_err); if (status) { NETAPI_STATUS(ctx, status, "NetShareSetInfo"); goto out; } status = NetShareGetInfo(hostname, sharename, 501, (uint8_t **)&i501); if (status) { NETAPI_STATUS(ctx, status, "NetShareGetInfo"); goto out; } if (strcasecmp(i501->shi501_remark, comment) != 0) { NETAPI_STATUS(ctx, status, "NetShareGetInfo"); goto out; } /* delete */ printf("testing NetShareDel\n"); status = NetShareDel(hostname, sharename, 0); if (status) { NETAPI_STATUS(ctx, status, "NetShareDel"); goto out; }; /* should not exist anymore */ status = NetShareGetInfo(hostname, sharename, 0, &buffer); if (status == 0) { NETAPI_STATUS(ctx, status, "NetShareGetInfo"); goto out; }; status = 0; printf("NetShare tests succeeded\n"); out: if (status != 0) { printf("NetShare testsuite failed with: %s\n", libnetapi_get_error_string(ctx, status)); } return status; }
static DWORD SetInfo( int argc, char** ppszArgv ) { static const DWORD dwLevel = 502; DWORD dwError = 0; SHARE_INFO_502 newShareInfo = {0}; PSHARE_INFO_502 pShareInfo = NULL; DWORD dwParmErr = 0; PSECURITY_DESCRIPTOR_RELATIVE pSecDesc = NULL; DWORD dwSecDescSize = 0; DWORD dwAllowUserCount = 0; PWSTR* ppwszAllowUsers = NULL; DWORD dwDenyUserCount = 0; PWSTR* ppwszDenyUsers = NULL; BOOLEAN bReadOnly = FALSE; dwError = ParseShareArgs( argc, ppszArgv); BAIL_ON_SRVSVC_ERROR(dwError); dwError = NetShareGetInfo( gState.pwszServerName, gState.pwszTarget, dwLevel, OUT_PPVOID(&pShareInfo)); BAIL_ON_SRVSVC_ERROR(dwError); dwError = DeconstructSecurityDescriptor( pShareInfo->shi502_reserved, (PSECURITY_DESCRIPTOR_RELATIVE) pShareInfo->shi502_security_descriptor, &dwAllowUserCount, &ppwszAllowUsers, &dwDenyUserCount, &ppwszDenyUsers, &bReadOnly); BAIL_ON_SRVSVC_ERROR(dwError); newShareInfo = *pShareInfo; if (gState.pwszName) { newShareInfo.shi502_netname = gState.pwszName; } if (gState.pwszComment) { newShareInfo.shi502_remark = gState.pwszComment; } if (gState.pwszPath) { newShareInfo.shi502_path = gState.pwszPath; } dwError = ConstructSecurityDescriptor( gState.dwAllowUserCount || gState.bClearAllow ? gState.dwAllowUserCount : dwAllowUserCount, gState.dwAllowUserCount || gState.bClearAllow ? gState.ppwszAllowUsers : ppwszAllowUsers, gState.dwDenyUserCount || gState.bClearDeny ? gState.dwDenyUserCount : dwDenyUserCount, gState.dwDenyUserCount || gState.bClearDeny ? gState.ppwszDenyUsers : ppwszDenyUsers, gState.bReadOnly || gState.bReadWrite ? (gState.bReadOnly && !gState.bReadWrite) : bReadOnly, &pSecDesc, &dwSecDescSize); BAIL_ON_SRVSVC_ERROR(dwError); newShareInfo.shi502_type = pShareInfo->shi502_type; newShareInfo.shi502_reserved = dwSecDescSize; newShareInfo.shi502_security_descriptor = (PBYTE) pSecDesc; dwError = NetShareSetInfo( gState.pwszServerName, gState.pwszTarget, dwLevel, &newShareInfo, &dwParmErr); BAIL_ON_SRVSVC_ERROR(dwError); cleanup: if (pShareInfo) { SrvSvcFreeMemory(pShareInfo); } FreeStringArray(dwAllowUserCount, ppwszAllowUsers); FreeStringArray(dwDenyUserCount, ppwszDenyUsers); LW_SAFE_FREE_MEMORY(pSecDesc); return dwError; error: goto cleanup; }