eManual.ru - электронная документация
Секция 2 из 3 - Предыдущая - Следующая
Все секции
- 1
- 2
- 3
itoa(binIp[0], dot, 10);
strcat(result,dot);
binIp[1] = (BYTE)((ipHO & 0x00ff0000) >> 16);
itoa(binIp[1], dot, 10);
strcat(result, "."); strcat(result, dot);
binIp[2] = (BYTE)((ipHO & 0x0000ff00) >> 8);
itoa(binIp[2], dot, 10);
strcat(result, "."); strcat(result, dot);
binIp[3] = (BYTE)(ipHO & 0x000000ff);
itoa(binIp[3], dot, 10);
strcat(result,"."); strcat(result, dot);
strcat(result,"rn");
i++;
} while ((pIpNO != NULL) && (iterations < 6));
WSACleanup();
PostQuitMessage(0);
return;
}
15)--------------------------------------------------------------------------
Q> Как определить тип Windows на компьютере?
A>
bool OsTypeNT(void)
{
OSVERSIONINFO vi;
vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&vi);
if (vi.dwPlatformId==VER_PLATFORM_WIN32_NT)
return true;
return false;
}
16)--------------------------------------------------------------------------
Q> Как подключить сетевой диск?
A>
DWORD ConnectRemoteDrive(LPSTR ShareName,LPSTR LocalDrive)
{
NETRESOURCE nr;
ZeroMemory(&nr,sizeof(nr));
nr.dwScope=RESOURCE_GLOBALNET;
nr.dwType=RESOURCETYPE_DISK;//RESOURCETYPE_ANY;
nr.dwDisplayType=RESOURCEDISPLAYTYPE_GENERIC;
nr.dwUsage=RESOURCEUSAGE_CONNECTABLE;
nr.lpLocalName=LocalDrive;
nr.lpRemoteName=ShareName;
nr.lpComment="";
nr.lpProvider=NULL;
return WNetAddConnection2(&nr, // NETRESOURCE from enumeration
(LPSTR) NULL, // no password
(LPSTR) NULL, // logged-in user
CONNECT_UPDATE_PROFILE); // update profile with connect info
}
17)-------------------------------------------------------------------------
Q> А как его отключить?
A> WNetCancelConnection2(LPSTR LocalDrive,CONNECT_UPDATE_PROFILE,TRUE);
18)-------------------------------------------------------------------------
Q> Как послать сообщение юзеру(а-ля net send)
A>
Вариант 1:
NET_API_STATUS x=NetMessageBufferSend(
LPTSTR servername,
LPTSTR msgname,
LPTSTR fromname,
LPBYTE buf,
DWORD buflen
);
Вариант 2:
From: "Alexandr Shandra" <entryway@astral.ntu-kpi.kiev.ua>
Можно через CreateFile/WriteFile, но в этом случае можно послать сообщение
только компьютеру либо на локальную рабочую группу.
Вот пример:(работает как под NT так и под 9x);
HANDLE hSlot = CreateFile("\\computername\mailslot\messngr",
GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hSlot != INVALID_HANDLE_VALUE)
{
char buf = "From To Message ";
uint cb = sizeof(buf);
WriteFile(hSlot, buf, cb, &cb, NULL);
CloseHandle(hSlot);
}
19)--------------------------------------------------------------------------
Q> Как создать юзера и дать ему права?
A>
NET_API_STATUS UserAdd(LPSTR username) //(c) Serge Andyk
{
// некоторые используемые функции описаны выше
USER_INFO_2 user_info;
char compname[256];
wchar_t wcompname[256];
DWORD parm_err=0;
LSA_HANDLE PolicyHandle;
LPTSTR lpszSystemInfo; // ptr. to system info. string
DWORD cchBuff = 256; // size of comp. or user name
TCHAR tchBuffer2[256]; // buffer for concat'd. str.
WCHAR wGroupNameAdd[20]=L"Administrators";
lpszSystemInfo = tchBuffer2;
ZeroMemory(&user_info,sizeof(user_info));
GetComputerName(lpszSystemInfo, &cchBuff);
strcpy(compname,"\\");
strcat(compname,lpszSystemInfo);
mbstowcs( wcompname, compname, strlen(compname)+1 );
mbstowcs(user_info.usri2_name,username, strlen(username)+1 );
//-------создаем юзера------------//
user_info.usri2_password = L"";
user_info.usri2_priv = USER_PRIV_USER;
user_info.usri2_flags =
UF_SCRIPT|UF_PASSWD_CANT_CHANGE|UF_DONT_EXPIRE_PASSWD|UF_NORMAL_ACCOUNT;
user_info.usri2_acct_expires=TIMEQ_FOREVER;
NetUserAdd(wcompname,// PDC name
2L, // level
(LPBYTE)&user_info, // input buffer
&parm_err ); // parameter in error
GetAccountSid(
NULL, // default lookup logic
username, // account to obtain SID
&pSid // buffer to allocate to contain resultant SID
);
NetLocalGroupAddMember(0,wGroupNameAdd,pSid);
//---------даем ему кое-какие права-----------//
OpenPolicy(
wcompname, // target machine
POLICY_ALL_ACCESS,
&PolicyHandle // resultant policy handle
);
SetPrivilegeOnAccount(
PolicyHandle, // policy handle
pSid, // SID to grant privilege
L"SeInteractiveLogonRight", // Unicode privilege
TRUE // enable the privilege
);
SetPrivilegeOnAccount(
PolicyHandle,
pSid,
L"SeNetworkLogonRight",
TRUE
);
LsaClose(PolicyHandle);
return 0;
}
20)--------------------------------------------------------------------------
Q> Как узнать какие пользователи есть на моей (или не моей) машине
A>
#define STRICT
#include <windows.h>
#include <lm.h>
#include <iostream.h>
#include <tchar.h>
void UserEnum()
{
BOOL keepGoing = TRUE ;
DWORD entriesRead, totalEntries ;
USER_INFO_2 * pInfo = NULL ;
DWORD resumeHandle = 0 ; // must be 0 to start with
char nameBuf[ UNLEN + 1 ] ; // constants defined in LMCONS.H
char commentBuf[ MAXCOMMENTSZ + 1 ] ;
WCHAR serverName[ 100 ] ;
lstrcpyW( serverName, L"\\PDC" ) ; //L"" ) ;
while ( keepGoing )
{
NET_API_STATUS ret = NetUserEnum(
serverName, //NULL,
2,
0, //FILTER_NORMAL_ACCOUNT,
(LPBYTE *)&pInfo, // Important: ADDRESS of POINTER
sizeof( USER_INFO_2 ) * 100, // requested buffer size;
&entriesRead,
&totalEntries,
&resumeHandle ) ;
keepGoing = ( ret == ERROR_MORE_DATA ) ;
if ( ret == 0 || ret == ERROR_MORE_DATA )
{
DWORD i ;
for ( i = 0 ; i < entriesRead ; i++ )
{
// Note that strings in the INFO structures
// will ALWAYS be Unicode, regardless of
// your settings! Even though they're declared
// as LPTSTR, they're always LPWSTR.
// I'm compiling for non-Unicode, so I
// convert them to ANSI strings...
// Check for NULL pointers in the INFO structure
LPWSTR pName = (LPWSTR)pInfo[ i ].usri2_name ;
LPWSTR pComm = (LPWSTR)pInfo[ i ].usri2_comment ;
if ( pName == NULL )
{
lstrcpy( nameBuf, "(no name!)" ) ;
}
else if ( lstrlenW( pName ) == 0 )
{
lstrcpy( nameBuf, "(empty name!)" ) ;
}
else
{
WideCharToMultiByte( CP_ACP, 0,
pName, -1,
nameBuf, UNLEN,
NULL, NULL ) ;
}
if ( pComm == NULL )
{
lstrcpy( commentBuf, "(no comment!)" ) ;
}
else if ( lstrlenW( pComm ) == 0 )
{
lstrcpy( commentBuf, "(empty comment!)" ) ;
}
else
{
WideCharToMultiByte( CP_ACP, 0,
pComm, -1,
commentBuf, MAXCOMMENTSZ,
NULL, NULL ) ;
}
cout << nameBuf << ": " << commentBuf << endl ;
}
}
else
{
cout << "NetUserEnum error " << ret << endl ;
}
if ( pInfo )
{
NetApiBufferFree( pInfo ) ;
pInfo = NULL ;
}
}
}
21)----------------------------------------------------------------------------
Q> Кто по сети или локально шарится по моей(не моей)машине?
A>
//------------------------------------------------------
// Who.exe (c) 1999 Serge Andyk asvzzz@chat.ru
// Usage "who [server]". Show all local and network users
// on specified server and some additional information.
// Freeware.You can use and modify this source code
// as you wish.
//-------------------------------------------------------
#include <windows.h>
#include <lm.h>
#include <stdio.h>
#pragma hdrstop
#pragma comment( lib, "netapi32.lib" )
#define MAXLEN 256
SESSION_INFO_502 *buf, *cur;
WKSTA_USER_INFO_1 *bufw, *curw;
FILE_INFO_3 *buff,*curf;
DWORD read, total, resumeh, rc, i;
//-----------------------------------------------------------
void PrintError( DWORD err )
{
char msgbuf[4096];
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
msgbuf, sizeof( msgbuf ), NULL );
printf( "Error %d: %sn", err, msgbuf );
}
//-------------------------------------------------------
void PrintLocalUsers(LPWSTR server)
{
resumeh = 0;
do
{
bufw = NULL;
rc = NetWkstaUserEnum(
(LPTSTR)server,
1,
(LPBYTE*) &bufw,
2048,
&read,
&total,
&resumeh );
if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
break;
{
for ( i = 0, curw = bufw; i < read; ++ i, ++ curw )
{
printf( "%-12S %-15S %-12S n",
curw->wkui1_username, curw->wkui1_logon_domain,
curw->wkui1_logon_server
);
}
}
if ( bufw != NULL )
NetApiBufferFree( bufw );
} while ( rc == ERROR_MORE_DATA );
if ( rc != ERROR_SUCCESS ) PrintError( rc );
}
//-------------------------------------------------------
void PrintNetUsers(LPWSTR server)
{
resumeh = 0;
do
{
buf = NULL;
rc = NetSessionEnum(
(LPTSTR) server,
NULL,
NULL,
502,
(LPBYTE*)&buf,
2048,
&read,
&total,
&resumeh );
if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
break;
{
for ( i = 0, cur = buf; i < read; ++ i, ++ cur )
{
printf( "%-12S %-12S %-27S %-22Sn",
cur->sesi502_username, cur->sesi502_cname, cur->sesi502_transport,
cur->sesi502_cltype_name
);
}
}
if ( buf != NULL )
NetApiBufferFree( buf );
} while ( rc == ERROR_MORE_DATA );
if ( rc != ERROR_SUCCESS ) PrintError( rc );
}
//-------------------------------------------------------
void PrintNetFiles(LPWSTR server)
{
resumeh = 0;
do
{
buff = NULL;
rc=NetFileEnum(
(char *) server,
NULL,
NULL,
3,
(BYTE**)&buff,
2048,
&read,
&total,
&resumeh );
if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS )
break;
for ( i = 0, curf = buff; i < read; ++ i, ++ curf )
{
printf( "%-12S %-15S n",
curf->fi3_username, curf->fi3_pathname
);
}
if ( buff != NULL )
NetApiBufferFree( buff );
} while ( rc == ERROR_MORE_DATA );
if ( rc != ERROR_SUCCESS ) PrintError( rc );
}
//-------------------------------------------------------
int main( int argc, char *argv[] )
{
WCHAR server[MAXLEN];
if ( argc == 1 )
{
wcscpy(server,L"");
}
else
if ( argc == 2 )
{
mbstowcs( server, argv[1],MAXLEN);
}
else
{
printf("Usage - who [server]");
exit(1);
}
printf("nLocal users:n");
PrintLocalUsers(server);
printf("nNet users:n");
PrintNetUsers(server);
printf("nFiles(Pipes)n");
PrintNetFiles(server);
return 0;
}
22)---------------------------------------------------------------------------
Q> Как в мультипроцессорной системе указать задаче на каком процессоре работать?
A>
HANDLE threadHandle = GetCurrentThread();
SetThreadIdealProcessor(threadHandle, 1);
23)---------------------------------------------------------------------------
Q> Как установить (узнать) приоритет процесса?
A>
{
HANDLE procHandle = GetCurrentProcess();
if (!SetPriorityClass(procHandle, HIGH_PRIORITY_CLASS))
RET_ERR("SetPriorityClass");
DWORD priorityClass = GetPriorityClass(procHandle);
ADD_STR("Priority Class is set to : ");
switch(priorityClass)
{
case HIGH_PRIORITY_CLASS:
ADD_STR("HIGH_PRIORITY_CLASSrn");
break;
case IDLE_PRIORITY_CLASS:
ADD_STR("IDLE_PRIORITY_CLASSrn");
break;
case NORMAL_PRIORITY_CLASS:
ADD_STR("NORMAL_PRIORITY_CLASSrn");
break;
case REALTIME_PRIORITY_CLASS:
ADD_STR("REALTIME_PRIORITY_CLASSrn");
break;
default:
ADD_STR("Unknown priority classrn");
}
return result_buffer;
}
24)---------------------------------------------------------------------------
Q> Как установить (узнать) приоритет нити?
A>
{
HANDLE threadHandle = GetCurrentThread();
if (!SetThreadPriority(threadHandle, THREAD_PRIORITY_HIGHEST))
RET_ERR("SetThreadPriority");
int priority = GetThreadPriority(threadHandle);
if (priority == THREAD_PRIORITY_ERROR_RETURN)
RET_ERR("GetThreadPriority");
switch (priority)
{
case THREAD_PRIORITY_ABOVE_NORMAL:
ADD_STR("THREAD_PRIORITY_ABOVE_NORMALrn");
break;
case THREAD_PRIORITY_BELOW_NORMAL:
ADD_STR("THREAD_PRIORITY_BELOW_NORMALrn");
break;
case THREAD_PRIORITY_HIGHEST:
ADD_STR("THREAD_PRIORITY_HIGHESTrn");
break;
case THREAD_PRIORITY_IDLE:
ADD_STR("THREAD_PRIORITY_IDLErn");
break;
case THREAD_PRIORITY_LOWEST:
ADD_STR("THREAD_PRIORITY_LOWESTrn");
break;
case THREAD_PRIORITY_NORMAL:
ADD_STR("THREAD_PRIORITY_NORMALrn");
break;
case THREAD_PRIORITY_TIME_CRITICAL:
ADD_STR("THREAD_PRIORITY_TIME_CRITICALrn");
break;
default:
ADD_STR("Unknownrn");
}
return result_buffer;}
25)---------------------------------------------------------------------------
Q> Как определить тип NT - server или workstation?
A> Через регистри -
HKEY_LOCAL_MACHINESystemCurrentControlSetControlProductOptions
Значение "Product Type". Три возможных варианта :
"WinNT" workstation
"ServerNT" server
"LanmanNT" domain controller
26)--------------------------------------------------------------------------
Q> Как проследить чтобы только одна копия приложения работала в данный момент
A>
BOOL WeAreAlone (LPSTR szName)
{
HANDLE hMutex = CreateMutex (NULL, TRUE, szName);
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
return FALSE;
}
return TRUE;
}
И в начале WinMain или main -
if (WeAreAlone ("Some_Unique_Name_Or_Other"))
{
// Proceed
}
else
{
MessageBox (NULL,"Error","Error: app already running!",MB_OK|MB_ICONERROR);
exit(1);
}
27)---------------------------------------------------------------------------
Q> Имеется PID процесса,как узнать имя "process executable"?
A>
#include <psapi.h>
#pragma comment(lib,"psapi.lib")
//psapi.h,lib,dll есть в VC5 и VC6
HANDLE hProc;
char szProcessName [80];
HMODULE ahMod [10];
DWORD dwNeeded;
hProc = OpenProcess (PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
FALSE,
PID); // PID должен быть обьявлен как DWORD
if (hProc)
{
if (EnumProcessModules (hProc,
ahMod,
sizeof(ahMod),
&dwNeeded))
{
if (GetModuleBaseName (hProc,
ahMod[0],
szProcessName,
sizeof(szProcessName)))
{
<success>
}
else
{
<failure>
}
}
CloseHandle (hProc);
}
}
28)--------------------------------------------------------------------------
Q> Как извлечь версию EXE,DLL и т.д.?
A>
void GetVersionOfFile (char * pszAppName, // file
char * pszVerBuff, // receives version
int iVerBuffLen, // size of buffer
char * pszLangBuff, // receives language
int iLangBuffLen) // size of buffer
{
DWORD dwScratch;
DWORD * pdwLangChar;
DWORD dwInfSize ;
UINT uSize;
BYTE * pbyInfBuff;
char szVersion [32];
char szResource [80];
char * pszVersion = szVersion;
dwInfSize = GetFileVersionInfoSize (pszAppName, &dwScratch);
if (dwInfSize)
{
pbyInfBuff = new BYTE [dwInfSize];
memset (pbyInfBuff, 0, dwInfSize);
if (pbyInfBuff)
{
if (GetFileVersionInfo (pszAppName, 0, dwInfSize, pbyInfBuff))
{
if (VerQueryValue (pbyInfBuff,
"\VarFileInfo\Translation",
(void**)(&pdwLangChar),
&uSize))
{
if (VerLanguageName (LOWORD (*pdwLangChar),
szResource,
sizeof(szResource)))
{
strncpy (pszLangBuff, szResource, iLangBuffLen);
}
wsprintf (szResource, "\StringFileInfo\%04X%04X\FileVersion",
LOWORD (*pdwLangChar), HIWORD (*pdwLangChar));
if (VerQueryValue (pbyInfBuff,
szResource,
(void**)(&pszVersion),
&uSize))
{
strncpy (pszVerBuff, pszVersion, iVerBuffLen-1);
}
}
}
delete [] pbyInfBuff;
}
}
}
29)---------------------------------------------------------------------------
Q> Как узнать имя дефолтового web browsera и , вообще, как узнать - с
Q> какой программой ассоциирован данный тип файла (напр .HTM или .ZIP)?
A> Создать временный .htm или .zip и использовать апишную FindExecutable
30)---------------------------------------------------------------------------
Q> Как удалить директорию,если она не пустая?
A>
SHFILEOPSTRUCT sh;
sh.hwnd = GetSafeHwnd(); //Для BCB sh.hwnd=FormX->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = "c:\test ";
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);
Этот код выносит все дерево, начиная с (и включая) с:test
31)----------------------------------------------------------------------------
Q> Как запретить переключение по alt-tab?
A>
Для MSVC:
CMainFrame::CMainFrame()
{
m_nHotKeyID = 100;
BOOL m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(), m_nHotKeyID,
MOD_ALT, VK_TAB);
ASSERT(m_isKeyRegistered != FALSE);
}
//Убираем блокировку при выходе из приложения
CMainFrame::~CMainFrame()
{
BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
ASSERT(m_isKeyUnregistered != FALSE);
}
Для BCB:
DWORD m_nHotKeyID = 100;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
BOOL m_isKeyRegistered = RegisterHotKey(Form1->Handle, m_nHotKeyID,
MOD_ALT, VK_TAB);
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
BOOL m_iskeyUnregistered = UnregisterHotKey(Form1->Handle, m_nHotKeyID);
}
32)----------------------------------------------------------------------------
Q> Как программно нажать клавишу (Num Lock например)?
A>
Win95/98:
{
BYTE KeyboardState[ 256 ];
GetKeyboardState( KeyboardState );
KeyboardState[ VK_NUMLOCK ] = KeyboardState[ VK_NUMLOCK ] ^ 1;
SetKeyboardState( KeyboardState );
}
WinNT:
{
keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
keybd_event( VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0
);
}
33)--------------------------------------------------------------------------
Q> Как соединиться по RAS ?
A>
#include <ras.h>
#include <raserror.h>
bool DialUp(LPTSTR PhoneNumber,LPTSTR UserName,LPTSTR Password)
{
RASDIALPARAMS rdParams;
rdParams.dwSize = sizeof(RASDIALPARAMS);
rdParams.szEntryName[0] = ' ';
lstrcpy( rdParams.szPhoneNumber, PhoneNumber );
rdParams.szCallbackNumber[0] = ' ';
lstrcpy( rdParams.szUserName, UserName );
lstrcpy( rdParams.szPassword, Password );
rdParams.szDomain[0] = ' ';
HRASCONN hRasConn = NULL;
DWORD dwRet = RasDial( NULL, NULL, &rdParams, 0L, NULL, &hRasConn );
if ( dwRet == 0 ) return true;
char szBuf[256];
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "Undefined RAS Dial Error (%ld).", dwRet );
RasHangUp( hRasConn );
MessageBox( (LPSTR)szBuf, "Error", MB_OK | MB_ICONSTOP );
return false;
}
34)----------------------------------------------------------------------------
Q> Как определить,имеется ли соединение по RAS?
A>
BOOL IsInternetConnected ()
{
DWORD nRasDevices = 20;
DWORD nSize = 20;
RASCONN rasconnected [10]; // Ras Connected struct
rasconnected[0].dwSize = sizeof(RASCONN);
RasEnumConnections( rasconnected, &nSize, &nRasDevices );
return ( BOOL (nRasDevices) );
}
Note:95 считает что соединение произошло,как только модем подымает трубу ;-)
35)--------------------------------------------------------------------------
Q> Как разорвать соединение?
A>
bool HangUp()
{
RASCONN ras[20];
DWORD dSize, dNumber;
char szBuf[256];
ras[0].dwSize = sizeof( RASCONN );
dSize = sizeof( ras ); // Get active RAS - Connection
DWORD dwRet = RasEnumConnections( ras, &dSize, &dNumber );
if ( dwRet != 0 )
{
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "Undefined RAS Enum Connections error (%ld).", dwRet
);
MessageBox( (LPSTR)szBuf, "RasHangUp", MB_OK | MB_ICONSTOP );
return false;
}
bool bOK = true;
for( DWORD dCount = 0; dCount < dNumber; dCount++ )
{ // Hang up that connection
HRASCONN hRasConn = ras[dCount].hrasconn;
DWORD dwRet = RasHangUp( hRasConn );
if ( dwRet != 0 )
{
char szBuf[256];
if ( RasGetErrorString( (UINT)dwRet, (LPSTR)szBuf, 256 ) != 0 )
wsprintf( (LPSTR)szBuf, "Undefined RAS HangUp Error (%ld).", dwRet );
MessageBox( (LPSTR)szBuf, "RasHangUp", MB_OK | MB_ICONSTOP );
bOK = false;
}
}
return bOK;
}
36)---------------------------------------------------------------------------
Q>Как узнать максимум информации о типе и возможностях ОС на удаленной машине
A>
NetServerGetInfo(LPTSTR servername,DWORD level,LPBYTE *bufptr);
Откликаются все операционки производства MS и UNIXы с установленной самбой.
Выдают о себе все что сами знают ;-)
37)----------------------------------------------------------------------------
Q> Как создать hard link на NTFS?
A>
#include <windows.h>
#include <stdio.h>
#pragma hdrstop
#define err doerr( __FILE__, __LINE__ )
void doerr( const char *file, int line )
{
DWORD e;
e = GetLastError();
if ( e == 0 )
return;
printf( "%s(%d): gle = %lun", file, line, e );
exit( 2 );
}
void enableprivs()
{
HANDLE hToken;
byte buf[sizeof TOKEN_PRIVILEGES * 2];
TOKEN_PRIVILEGES & tkp = *( (TOKEN_PRIVILEGES *) buf );
if ( ! OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
err;
// берем SeBackupPrivilege и SeRestorePrivilege
if ( !LookupPrivilegeValue( NULL, SE_BACKUP_NAME, &tkp.Privileges[0].Luid ) )
err;
if ( !LookupPrivilegeValue( NULL, SE_RESTORE_NAME, &tkp.Privileges[1].Luid ) )
err;
tkp.PrivilegeCount = 2;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tkp.Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp,
NULL, NULL );
}
int main( int argc, char *argv[] )
{
HANDLE fh;
if ( argc != 3 )
{
printf( "usage: lnw {file} {new_link_name}n" );
return 1;
}
enableprivs();
fh = CreateFile( argv[1], GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS, NULL );
if ( fh == INVALID_HANDLE_VALUE || fh == NULL ) err;
static char buf1[MAX_PATH];
static wchar_t buf2[MAX_PATH * 2];
char *p;
void *ctx = NULL;
WIN32_STREAM_ID wsi;
DWORD numwritten;
GetFullPathName( argv[2], MAX_PATH, &buf1[0], &p );
wsi.dwStreamId = BACKUP_LINK;
wsi.dwStreamAttributes = 0;
wsi.dwStreamNameSize = 0;
wsi.Size.QuadPart = strlen( buf1 ) * 2 + 2;
MultiByteToWideChar( CP_ACP, 0, buf1, strlen( buf1 ) + 1, buf2, MAX_PATH );
if ( ! BackupWrite( fh, (byte *) &wsi, 20, &numwritten, FALSE, FALSE, &ctx )
)err;
if ( numwritten != 20 ) err;
if ( ! BackupWrite( fh, (byte *) buf2, wsi.Size.LowPart, &numwritten, FALSE,
FALSE, &ctx ) )err;
if ( numwritten != wsi.Size.LowPart )err;
BackupWrite( fh, (byte *) &buf1[0], 0, &numwritten, TRUE, FALSE, &ctx );
CloseHandle( fh );
return 0;
}
38)----------------------------------------------------------------------------
Q> Как "зашедулить" задачу ?
A>
#include <windows.h>
#include <lm.h>
#include <stdio.h>
#include <stdlib.h>
#pragma hdrstop
#define BREAK_ME 1 /// #undef to get working code
#undef BREAK_ME
#pragma pack( push )
#ifdef BREAK_ME
#pragma pack( 2 )
#else
#pragma pack( 4 )
#endif
#include <lmat.h>
#pragma pack( pop )
#define lenof(x) ( sizeof (x) / sizeof (x)[0] )
int main( int argc, char *argv[] )
{
wchar_t server[256], cmd[1024];
AT_INFO at;
DWORD rc, id;
if ( argc < 2 || argc > 3 )
{
puts( "usage: nsja [\\server] "command"" );
return 1;
}
if ( argc > 2 )
mbstowcs( server, argv[2], lenof( server ) );
else
server[0] = L' ';
mbstowcs( cmd, argv[argc - 1], lenof( cmd ) );
memset( &at, ' ', sizeof at );
at.Command = &cmd[0];
rc = NetScheduleJobAdd( server, (byte *) &at, &id );
if ( rc != ERROR_SUCCESS )
printf( "NSJA() returned %lun", rc );
return 0;
}
39)----------------------------------------------------------------------------
Q> Как посмотреть,что же там уже "нашедулено"?
A>
#include <windows.h>
#include <lm.h>
#include <stdio.h>
#include <stdlib.h>
#pragma hdrstop
#define BREAK_ME 1 /// #undef to get working code
#undef BREAK_ME
#pragma pack( push )
#ifdef BREAK_ME
#pragma pack( 2 )
#else
#pragma pack( 4 )
#endif
#include <lmat.h>
#pragma pack( pop )
#define lenof(x) ( sizeof (x) / sizeof (x)[0] )
int main( int argc, char *argv[] )
{
wchar_t server[256];
AT_ENUM *pBuf, *pJob;
DWORD i, rc, nRead, nLeftBeforeCall, hResume;
bool goForIt;
if ( argc > 2 )
{
puts( "usage: nsje [\\server]" );
return 1;
}
if ( argc > 2 )
mbstowcs( server, argv[2], lenof( server ) );
else
server[0] = L' ';
hResume = 0;
printf( "%8.8s %.70sn", "JobId", "Command" );
printf( "%8.8s %.70sn", "--------",
"----------------------------------------------------------------------" );
goForIt = true;
while ( goForIt )
{
pBuf = NULL;
rc = NetScheduleJobEnum( *server == L' '? NULL: server, (BYTE **) &pBuf,
8192, &nRead, &nLeftBeforeCall, &hResume );
if ( rc != ERROR_SUCCESS && rc != ERROR_MORE_DATA )
{
printf( "Doh! rc = %lun", rc );
return 1;
}
for ( pJob = pBuf, i = 0; i < nRead; ++ i, ++ pJob )
{
printf( "%8lu %.70Sn", pJob->JobId, pJob->Command );
}
if ( pBuf != NULL )
NetApiBufferFree( pBuf );
if ( rc == ERROR_SUCCESS )
goForIt = false;
}
return 0;
}
40)----------------------------------------------------------------------------
Q> Можно ли в 95 использовать функции Net*() (NetFileEnum и т.п.)?
A> Можно.
Вариант 1: Делаем по порядку -
п.1 - Покупаем качественный бубен.
п.2 - Периодически постукивая бубном и обходя нижеприведенные
грабли пишем прогу.
В Win95 вы должны включать файл svrapi.h,а не lm.h как в NT.
Также нужно использовать svrapi.lib и svrapi.dll,а не netapi32.lib и
netapi32.dll.Если хочется поддерживать обе платформы - прийдется dll
грузить динамически.
Внимание: в 95 Net*() функции имеют другую семантику по сравнению с NT.
Строки должны быть в ANSI,не все уровни доступны.Возвращаемые структуры
различны.Управление памятью различно.
Для NT требуется адрес указателя на буфер,95-му надо указатель на буфер.
// Windows NT
BYTE *buf;
DWORD prefmaxlen;
// ...
buf = NULL;
prefmaxlen = 8192; // or whatever
result = NetSomeFunction( ..., &buf, prefmaxlen, ... );
// process buffer ...
NetApiBufferFree( buf );
// Windows 9X
BYTE *buf;
WORD cbBuffer;
// ...
cbBuffer = 8192; // or whatever
buf = (BYTE *) malloc( cbBuffer );
result = NetSomeFunction( ..., buf, cbBuffer ... );
// process buffer ...
free( buf );
Крайне рекомендуется посмотреть svrapi.h файл.
PS: Если ничего не получается - то или эта функция вообще отсутствует
в srvapi.h и dll(неплохо бы сначала посмотреть), или мало трясли бубном.
PPS: Говорят еще хорошо помогает дудочка из малой берцовой кости
девственницы - духов хорошо ублажает ;-)
Вариант 2:
From: "Michael L. Stepuchev" <stepuchev@prognoz.ru>
Для Windows 95 есть что-то типа Administration Kit (лежит в WinNT Resource
Kit). Вот там есть 2 dll-ины (radmin32.dll & rlocal32.dll), в
которых описаны все или почти все функции NT-евой netapi32.dll. Надо
юзать эти dll-ины.
41)----------------------------------------------------------------------------
Q> Как определить частоту процессора?
A>
WinNT:
HKEY_LOCAL_MACHINEHARDWAREDESCRIPTIONSystemCentralProcessor ~Mhz
42)---------------------------------------------------------------------------
Q> Как узнать MAC адрес сетевой карты?
Секция 2 из 3 - Предыдущая - Следующая
|