📄 edit.cpp
字号:
//////////////////////////////////////////////////////////////
// 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 + -