⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 edit.cpp

📁 网络共享资源的枚举
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////
// Copyright (C) 2002-2003 Bryce Cogswell 
// www.sysinternals.com
// cogswell@winternals.com
//
// You may modify and use this code for personal use only.
// Redistribution in any form is expressly prohibited
// without permission by the author.
//////////////////////////////////////////////////////////////
#define _WIN32_WINNT 0x404
#include <windows.h>
#include <aclui.h>
#include <aclapi.h>
#include <Lmshare.h>
#include <Lm.h>
#include <tchar.h>
#include "resource.h"
#include "shareenum.h"

//#pragma comment( lib, "aclui.lib" )
#pragma comment( lib, "comctl32.lib" )
#pragma comment( lib, "advapi32.lib" )
#pragma comment( lib, "user32.lib" )

// specific access rights
// ----------------------
// SC_MANAGER_ALL_ACCESS 
// WINSTA_ENUMDESKTOPS
// DESKTOP_READOBJECTS
// SERVICE_QUERY_CONFIG, SERVICE_ALL_ACCESS
// KEY_QUERY_VALUE, KEY_READ
// TOKEN_ASSIGN_PRIMARY
// PROCESS_TERMINATE         
// THREAD_TERMINATE               
// JOB_OBJECT_ASSIGN_PROCESS           
// MUTANT_QUERY_STATE  
// TIMER_QUERY_STATE   
// SECTION_QUERY       
// FILE_READ_DATA            
// CLUSAPI_READ_ACCESS


//#define SERVER_ACCESS_ADMINISTER    
//#define SERVER_ACCESS_ENUMERATE     
//#define SERVER_READ         
//#define SERVER_WRITE         
//#define SERVER_EXECUTE       

#define SHARE_FULLCONTROL	0x001F01FF
#define SHARE_CHANGE		0x001301BF
#define SHARE_READ			0x001200A9

SI_ACCESS g_ModifySharesAccess[] = {
	// these are a much easier-to-swallow listing of basic rights for desktops
	{ &GUID_NULL, SHARE_FULLCONTROL,	MAKEINTRESOURCE(IDS_FULL_CONTROL),	SI_ACCESS_GENERAL  },	// Full Control
	{ &GUID_NULL, SHARE_CHANGE,			MAKEINTRESOURCE(IDS_CHANGE),		SI_ACCESS_GENERAL  },	// Change
	{ &GUID_NULL, SHARE_READ,			MAKEINTRESOURCE(IDS_READ),			SI_ACCESS_GENERAL  },	// Read
#if 0
	// advanced (detailed) rights
	{ &GUID_NULL, 0x00000001,	MAKEINTRESOURCE( 1), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000002,	MAKEINTRESOURCE( 2), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000004,	MAKEINTRESOURCE( 3), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000008,	MAKEINTRESOURCE( 4), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000010,	MAKEINTRESOURCE( 5), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000020,	MAKEINTRESOURCE( 6), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000040,	MAKEINTRESOURCE( 7), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000080,	MAKEINTRESOURCE( 8), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000100,	MAKEINTRESOURCE( 9), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000200,	MAKEINTRESOURCE(10), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000400,	MAKEINTRESOURCE(11), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00000800,	MAKEINTRESOURCE(12), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00001000,	MAKEINTRESOURCE(13), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00002000,	MAKEINTRESOURCE(14), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00004000,	MAKEINTRESOURCE(15), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00008000,	MAKEINTRESOURCE(16), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00010000,	MAKEINTRESOURCE(17), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00020000,	MAKEINTRESOURCE(18), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00040000,	MAKEINTRESOURCE(19), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00080000,	MAKEINTRESOURCE(20), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00100000,	MAKEINTRESOURCE(21), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00200000,	MAKEINTRESOURCE(22), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00400000,	MAKEINTRESOURCE(23), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x00800000,	MAKEINTRESOURCE(24), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x01000000,	MAKEINTRESOURCE(25), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x02000000,	MAKEINTRESOURCE(26), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x04000000,	MAKEINTRESOURCE(27), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x08000000,	MAKEINTRESOURCE(28), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x10000000,	MAKEINTRESOURCE(29), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x20000000,	MAKEINTRESOURCE(30), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x40000000,	MAKEINTRESOURCE(31), SI_ACCESS_SPECIFIC },
	{ &GUID_NULL, 0x80000000,	MAKEINTRESOURCE(32), SI_ACCESS_SPECIFIC },
#endif
};


// Here's my crufted-up mapping for desktop generic rights
GENERIC_MAPPING g_ModifySharesGenericMapping = {
	SHARE_READ,			// GENERIC_READ
	SHARE_CHANGE,		// GENERIC_WRITE
	SHARE_READ,			// GENERIC_EXECUTE
	SHARE_FULLCONTROL,	// GENERIC_ALL
};


HINSTANCE	g_hInst;

PSECURITY_DESCRIPTOR UpdateSD( PSECURITY_DESCRIPTOR OldSD, PSECURITY_DESCRIPTOR NewSD, SECURITY_INFORMATION ri )
{
	BOOL    present;
	BOOL    defaulted;
	PACL	pacl;
	PSID	psid;

	PSECURITY_DESCRIPTOR	sd = LocalAlloc( LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH );
	InitializeSecurityDescriptor( sd, SECURITY_DESCRIPTOR_REVISION );

	if ( OldSD == NULL )
		OldSD = sd;	// use empty descriptor

	//
	// Get SACL
	//
	if ( ! GetSecurityDescriptorSacl( ri & SACL_SECURITY_INFORMATION ? NewSD : OldSD, &present, &pacl, &defaulted ) )
		return NULL;
	SetSecurityDescriptorSacl( sd, present, pacl, defaulted );

	//     
	// Get DACL     
	//      
	if ( ! GetSecurityDescriptorDacl( ri & DACL_SECURITY_INFORMATION ? NewSD : OldSD, &present, &pacl, &defaulted ) )         
		return NULL;      
	SetSecurityDescriptorDacl( sd, present, pacl, defaulted );

	//     
	// Get Owner     
	//
	if ( ! GetSecurityDescriptorOwner( ri & OWNER_SECURITY_INFORMATION ? NewSD : OldSD, &psid, &defaulted ) )         
		return NULL;      
	SetSecurityDescriptorOwner( sd, psid, defaulted );

	//     
	// Get Group     
	//      
	if ( ! GetSecurityDescriptorGroup( ri & GROUP_SECURITY_INFORMATION ? NewSD : OldSD, &psid, &defaulted ) )         
		return NULL;      
	SetSecurityDescriptorGroup( sd, psid, defaulted );

	return sd;
}  


#if 0
struct SidTable : IDataObject
{
	long		m_cRefs;
	int			m_Cnt;
	int			m_Pos;
	HGLOBAL		m_hGlobal;

	SidTable( int cnt )
	{
		m_cRefs		= 0;
		m_Cnt		= cnt;
		m_Pos		= 0;
		m_hGlobal	= GlobalAlloc( GMEM_SHARE, sizeof SID_INFO_LIST + (cnt - ANYSIZE_ARRAY)*sizeof(SID_INFO) + cnt * 2*MAX_PATH * sizeof(TCHAR) );
	}

	~SidTable()
	{
	}

	bool Add( PSID psid, const TCHAR * Name, SID_NAME_USE Use )
	{
		if ( m_Pos >= m_Cnt )
			return false;

		SID_INFO_LIST	*	sids = (SID_INFO_LIST *) GlobalLock( m_hGlobal );
		SID_INFO		*	si   = &sids->aSidInfo[ m_Pos++ ];

		sids->cItems		= m_Pos;
		si->pSid			= psid;
		
		si->pwzCommonName	= (TCHAR *)&sids->aSidInfo[ m_Cnt ] + (m_Pos-1)*2*MAX_PATH;
		_tcscpy( si->pwzCommonName, Name );
		
		si->pwzUPN			= NULL;

		switch ( Use )  {
			case SidTypeUser:	
				si->pwzClass	= _T("User");	
				break;
			case SidTypeGroup:	
			case SidTypeAlias:	
				si->pwzClass	= _T("Group");	
				break;
			case SidTypeComputer:
				si->pwzClass	= _T("Computer");	
				break;
			default:
				si->pwzClass	= NULL;
				break;
		}

		GlobalUnlock( m_hGlobal );
		return true;
	}

	STDMETHODIMP QueryInterface( REFIID iid, void** ppv )
	{
		if ( iid == IID_IDataObject || IID_IUnknown == iid )  {
			*ppv = this;
		} else {
			*ppv = NULL;
			return E_NOINTERFACE;
		}

		reinterpret_cast<IUnknown*>( *ppv )->AddRef();
		return S_OK;
	}
	STDMETHODIMP_(ULONG) AddRef()
	{
		return ++m_cRefs;
	}
	STDMETHODIMP_(ULONG) Release()
	{
		ULONG n = --m_cRefs;
		if ( n == 0 )
			delete this;
		return n;
	}

    HRESULT STDMETHODCALLTYPE GetData( FORMATETC * pformatetcIn, STGMEDIUM * pmedium )
	{
		if ( pformatetcIn->cfFormat != RegisterClipboardFormat( CFSTR_ACLUI_SID_INFO_LIST ) )
			return E_INVALIDARG;
		
		if ( pformatetcIn->tymed != TYMED_HGLOBAL )
			return E_INVALIDARG;

		pmedium->tymed		= TYMED_HGLOBAL;
		pmedium->hGlobal	= m_hGlobal;
		return S_OK;
	}
    HRESULT STDMETHODCALLTYPE GetDataHere( FORMATETC *pformatetc, STGMEDIUM *pmedium)
	{
		return E_NOTIMPL;
	}
    HRESULT STDMETHODCALLTYPE QueryGetData( FORMATETC *pformatetc)
	{
		return E_NOTIMPL;
	}
    HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc( FORMATETC *pformatectIn, FORMATETC *pformatetcOut )
	{
		return E_NOTIMPL;
	}
	HRESULT STDMETHODCALLTYPE SetData( FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease )
	{
		return E_NOTIMPL;
	}
	HRESULT STDMETHODCALLTYPE EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc )
	{
		return E_NOTIMPL;
	}
	HRESULT STDMETHODCALLTYPE DAdvise( FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection )
	{
		return E_NOTIMPL;
	}
    HRESULT STDMETHODCALLTYPE DUnadvise( DWORD dwConnection )    
	{
		return E_NOTIMPL;
	}
    HRESULT STDMETHODCALLTYPE EnumDAdvise( IEnumSTATDATA **ppenumAdvise )
	{
		return E_NOTIMPL;
	}
};


struct CObjectSecurityInfoBase2 : ISecurityInformation2
{
	long		m_cRefs;

	CObjectSecurityInfoBase2()
	  : m_cRefs(0)
	{
	}
	virtual ~CObjectSecurityInfoBase2() 
	{
	}

	STDMETHODIMP QueryInterface( REFIID iid, void** ppv )
	{
		if ( iid == IID_ISecurityInformation2  ||  IID_IUnknown == iid )  {
			*ppv = this;
		} else {
			*ppv = NULL;
			return E_NOINTERFACE;
		}

		reinterpret_cast<IUnknown*>( *ppv )->AddRef();
		return S_OK;
	}
	STDMETHODIMP_(ULONG) AddRef()
	{
		return ++m_cRefs;
	}
	STDMETHODIMP_(ULONG) Release()
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -