C++程序如下:
BOOL userfunction()
{
HANDLE hProcess = ::GetCurrentProcess();
SID_IDENTIFIER_AUTHORITY sia = SECURITY_WORLD_SID_AUTHORITY;
PSID pSid;
BOOL bSus = FALSE;
if (::AllocateAndInitializeSid(&sia,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&pSid))
{
HANDLE hToken;
if(::OpenProcessToken(hProcess,TOKEN_QUERY,&hToken))
{
DWORD dwReturnLength;
::GetTokenInformation(hToken,TokenUser,NULL,NULL,&dwReturnLength);
if(dwReturnLength <= 0x400)
{
LPVOID TokenInformation;
TokenInformation = ::LocalAlloc(LPTR,0x400);//这里就引用SDK的函数不引用CRT的了
DWORD dw;
if (::GetTokenInformation(hToken,TokenUser,TokenInformation,0x400,&dw))
{
PTOKEN_USER pTokenUser = (PTOKEN_USER)TokenInformation;
BYTE Buf[0x200];
PACL pAcl = (PACL)&Buf;
if ((::InitializeAcl(pAcl,1024,ACL_REVISION))
&& (::AddAccessDeniedAce(pAcl,ACL_REVISION,0x000000FA,pSid))
&& (::AddAccessAllowedAce(pAcl,ACL_REVISION,0x00100701,pTokenUser->User.Sid))
&& (::SetSecurityInfo(hProcess,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION,NULL,NULL,pAcl,NULL) == 0)
)
{
bSus = TRUE;
}
}
}
}
}; //Cleanup
if(hProcess != NULL)
{
::CloseHandle(hProcess);
}
if(pSid != NULL)
{
::FreeSid(pSid);
}
return bSus;
}关键是这里很多变量类型在delphi里面找不到对应的,十分困扰,请教delphi windows api编程的高手。
BOOL userfunction()
{
HANDLE hProcess = ::GetCurrentProcess();
SID_IDENTIFIER_AUTHORITY sia = SECURITY_WORLD_SID_AUTHORITY;
PSID pSid;
BOOL bSus = FALSE;
if (::AllocateAndInitializeSid(&sia,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&pSid))
{
HANDLE hToken;
if(::OpenProcessToken(hProcess,TOKEN_QUERY,&hToken))
{
DWORD dwReturnLength;
::GetTokenInformation(hToken,TokenUser,NULL,NULL,&dwReturnLength);
if(dwReturnLength <= 0x400)
{
LPVOID TokenInformation;
TokenInformation = ::LocalAlloc(LPTR,0x400);//这里就引用SDK的函数不引用CRT的了
DWORD dw;
if (::GetTokenInformation(hToken,TokenUser,TokenInformation,0x400,&dw))
{
PTOKEN_USER pTokenUser = (PTOKEN_USER)TokenInformation;
BYTE Buf[0x200];
PACL pAcl = (PACL)&Buf;
if ((::InitializeAcl(pAcl,1024,ACL_REVISION))
&& (::AddAccessDeniedAce(pAcl,ACL_REVISION,0x000000FA,pSid))
&& (::AddAccessAllowedAce(pAcl,ACL_REVISION,0x00100701,pTokenUser->User.Sid))
&& (::SetSecurityInfo(hProcess,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION,NULL,NULL,pAcl,NULL) == 0)
)
{
bSus = TRUE;
}
}
}
}
}; //Cleanup
if(hProcess != NULL)
{
::CloseHandle(hProcess);
}
if(pSid != NULL)
{
::FreeSid(pSid);
}
return bSus;
}关键是这里很多变量类型在delphi里面找不到对应的,十分困扰,请教delphi windows api编程的高手。
解决方案 »
- SendMessage WM_GETTEXT 的问题
- 求救,线程中操作ADOQUEY致DBGRID显示精神错乱?
- delphi7通过ado连接到局域网上的sqlkserver2000问题
- 如何知道一个事件是由哪个组件触发的?
- 关于ADOQuery中sql语句update的使用问题
- 谁能提供 IS EXPRESS DELPHI 4.0 BETA 下载?
- tsavedialog获取的路径是乱码?
- 求救:Intraweb在6.0以上的版本中,IWListbox不支持click了,怎么办?
- 求一数组的算法代码
- 大家看ADO和ACCESS连接的原代码啦,然后给点帮助!
- 快中秋节了,提前向各位坛友发送节日祝福,合家团圆!
- 怎样得到checklistbox选项的内容,谢谢了
function UserFunction: Boolean;
var
hProcess: THandle;
hToken: THandle;
sia: TSIDIdentifierAuthority;
sid: PSID;
dwReturnLength: DWord;
TokenInformation: Pointer;
dw: DWORD;
TokenUserInfo: PTokenUser;
Buf: array[0..$200 - 1] of Byte;
Acl: PACL;
begin
hProcess := GetCurrentProcess;
FillChar(sia, SizeOf(sia), 0);
sia.Value[5] := 1; Result := False;
if AllocateAndInitializeSid(sia, 1, 0, 0, 0, 0, 0, 0, 0, 0, sid) then
begin
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
begin
GetTokenInformation(hToken, TokenUser, nil, 0, dwReturnLength);
if dwReturnLength < $400 then
begin
TokenInformation := Pointer(LocalAlloc(LPTR, $400));
if GetTokenInformation(hToken, TokenUser, TokenInformation, $400, dw) then
begin
TokenUserInfo := PTokenUser(TokenInformation);
Acl := PACL(@Buf[0]);
if InitializeAcl(Acl^, 1024, 2)
and AddAccessDeniedAce(Acl^, 2, $000000FA, sid)
and AddAccessAllowedAce(Acl^, 2, $00100701, TokenUserInfo^.User.Sid)
and (SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION or $80000000, nil, nil, Acl, nil) = 0) then
begin
Result := True;
end;
end;
end;
end;
end; //Cleanup
if hProcess <> NULL then
begin
CloseHandle(hProcess);
end; if sid <> nil then
begin
FreeSid(sid);
end;
end;
变量类型还是不对,那个PTokenUser另外不知为什么,SetSecurityInfo函数也不对
Delphi中都有对应的类型申明的, 绝大多数你可以在Windows单元中找到它们。
并手动申明如下变量类型
type
PTOKENUSER = ^TOKEN_USER;
_TOKEN_USER = record
User: TSidAndAttributes;
end;
TOKEN_USER = _TOKEN_USER;
PTOKEN_USER = ^TOKEN_USER;
_TOKEN_USER = record
User: SID_AND_ATTRIBUTES ;
end;
TOKEN_USER = _TOKEN_USER; SE_OBJECT_TYPE = (
SE_UNKNOWN_OBJECT_TYPE = 0,
SE_FILE_OBJECT,
SE_SERVICE,
SE_PRINTER,
SE_REGISTRY_KEY,
SE_LMSHARE,
SE_KERNEL_OBJECT,
SE_WINDOW_OBJECT,
SE_DS_OBJECT,
SE_DS_OBJECT_ALL,
SE_PROVIDER_DEFINED_OBJECT,
SE_WMIGUID_OBJECT,
SE_REGISTRY_WOW64_32KEY
);Const SECURITY_NULL_SID_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,0));
SECURITY_WORLD_SID_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,1));
SECURITY_LOCAL_SID_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,2));
SECURITY_CREATOR_SID_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,3));
SECURITY_NON_UNIQUE_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,4));
SECURITY_NT_AUTHORITY : _SID_IDENTIFIER_AUTHORITY = ( Value : (0,0,0,0,0,5)); function SetSecurityInfo(
handle: THANDLE ;
ObjectType: SE_OBJECT_TYPE;
SecurityInfo: SECURITY_INFORMATION;
psidOwner: PSID;
psidGroup: PSID;
pDacl: PACL ;
pSacl: PACL
):LongWord; stdcall;external advapi32 name 'SetSecurityInfo';
function AllocateAndInitializeSid(const pIdentifierAuthority: PSIDIdentifierAuthority; (*Delphi 2007当中此参数的声明有问题*)
nSubAuthorityCount: Byte; nSubAuthority0, nSubAuthority1: DWORD;
nSubAuthority2, nSubAuthority3, nSubAuthority4: DWORD;
nSubAuthority5, nSubAuthority6, nSubAuthority7: DWORD;
var pSid: Pointer): BOOL; stdcall; external advapi32 name 'AllocateAndInitializeSid';
//下列API的第一个参数声明不应该使用var,所以重新声明
function InitializeAcl( pAcl: PACL; nAclLength, dwAclRevision: DWORD): BOOL; stdcall;external advapi32 name 'InitializeAcl';
function AddAccessDeniedAce(pAcl: PACL; dwAceRevision: DWORD;
AccessMask: DWORD; pSid: PSID): BOOL; stdcall;external advapi32 name 'AddAccessDeniedAce';
function AddAccessAllowedAce(pAcl: PACL; dwAceRevision: DWORD;
AccessMask: DWORD; pSid: PSID): BOOL; stdcall;external advapi32 name 'AddAccessAllowedAce';
function userfunction: LongBool;
var
hProcess: THandle;
sia: SID_IDENTIFIER_AUTHORITY;
_pSid: PSID;
bSus: LongBool;
hToken: THandle;
dwReturnLength: LongWord;
TokenInformation: Pointer;
dw: LongWord;
pTokenUser: PTOKEN_USER;
Buf: array [0..$200 - 1] of Byte;
_pAcl: PACL;
begin
hProcess := GetCurrentProcess();
sia := SECURITY_WORLD_SID_AUTHORITY;
bSus := FALSE;
if (AllocateAndInitializeSid(@sia ,1,0,0,0,0,0,0,0,0,_pSid)) then
begin
if(OpenProcessToken(hProcess,TOKEN_QUERY,hToken)) then
begin
GetTokenInformation(hToken,TokenUser,Nil,0,&dwReturnLength);
if(dwReturnLength <= $400) then
begin
TokenInformation := Pointer(LocalAlloc(LPTR,$400));//这里就引用SDK的函数不引用CRT的了
if (GetTokenInformation(hToken,TokenUser,TokenInformation,$400,dw)) then
begin
pTokenUser := PTOKEN_USER(TokenInformation);
_pAcl := PACL(@Buf[0]);
if ((InitializeAcl(_pAcl,1024, 2(*ACL_REVISION*)))
and (AddAccessDeniedAce(_pAcl,2(*ACL_REVISION*),$000000FA,_pSid))
and (AddAccessAllowedAce(_pAcl,2(*ACL_REVISION*),$00100701,pTokenUser^.User.Sid))
and (SetSecurityInfo(hProcess,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION or $80000000 (*PROTECTED_DACL_SECURITY_INFORMATION*),Nil,NIL,_pAcl,NIL) = 0)
) then
begin
bSus := TRUE;
end;
end;
end;
end;
end; //Cleanup
if(hProcess <> 0) then
begin
CloseHandle(hProcess);
end; if(_pSid <> NIL) then
begin
FreeSid(_pSid);
end;
Result := bSus;
end;