C-------------------DELPHIPHANDLE phToken, if (!phToken)
return WLX_SAS_ACTION_NONE; if (!(*phToken)) {
return WLX_SAS_ACTION_NONE;
}有人知道这个类型吗?
PGINA_CONTEXT,如下:
PGINA_CONTEXT pgContext = (PGINA_CONTEXT) pWlxContext;
return WLX_SAS_ACTION_NONE; if (!(*phToken)) {
return WLX_SAS_ACTION_NONE;
}有人知道这个类型吗?
PGINA_CONTEXT,如下:
PGINA_CONTEXT pgContext = (PGINA_CONTEXT) pWlxContext;
解决方案 »
- Delphi insert into报错问题
- 最近想买笔记本,大家给推荐一下。
- 请各位兄弟进来看看,给出个主意,小弟先谢过了
- 在封装基于TForm的类中,发布了新方法OnSetNewEnabled,但在实例的对象观察器中却看不到!
- 在delphi中如何读取foxpro中的备注字段?
- 一个有点难度的问题(请高手们进来看看)
- 打包后,把所需的库等等都加了!
- 请问代码中的self和sender各有什么作用
- 抓图问题
- qrCompositereport控件ColumnHeader显示不出来,救救我???
- 怎样将一文本以行为单位读入到一数组中呀?
- 怎样修改StringGrid控件源码来提高读取数据库数据的速度??
if (!(*phToken)) --- 指向指针的指针吧,应该是:if phToken^ <> 0 then...
后一个我猜对了,前一个我而以为是
if Integer(phToken) <> 0 then
....再试试。
你的理解沒有問題啊!一個是整量(或者指針的)的比較一個是指針指向的內存中的東西的比較
哦?真侥幸,
但是我发现无论如何
Integer(phToken) 都 <> 0
按源代码(别人用C写的)的话,永远都会返回去,不能执行后面的代码。
如下:
if (!phToken)
return WLX_SAS_ACTION_NONE;我这样写的:
if phToken <> nil then
begin
Result := WLX_SAS_ACTION_NONE;
SaveInfo('Integer(phToken)');
Exit;
end;
这就进行不下去的。
也是对的吧。实现自己的自动登录的GINA,要实现哪些过程,
好像不要全部,但是MSN列出了十个左右的实现,
我不知道是不是都要翻译一下,修改我的代码,
應該可以
你說的, 當時考慮將我們的系統, 加上一些智能卡 讀取自動登錄電腦, 就看了些資料, 好象只要几個函數, 5, 6 個導出就可
pAuthenticationId: PLargeInteger; pLogonSid: PSID; pdwOptions: PDWORD;
phToken: PHandle; pMprNotifyInfo: PWlxMprNotifyInfo; out pProfile: Pointer
): Integer; stdcall;
var
pgContext: PGinaContext; //PGINA_CONTEXT;
userStats: TOKEN_STATISTICS;
cbStats: DWORD; pGroups: PTokenGroups;//PTOKEN_GROUPS;
cbGroups: ULONG;
i: ULONG; login, password, domain: string;
iLogResult: DWORD;
begin
result := WLX_SAS_ACTION_NONE;
pgContext := PGinaContext (pWlxContext); if (phToken <> nil) then
begin
iLogResult := TFormGPL.MostraGPL(Login, Password, Domain);//вызов диалога
case iLogResult of
idOk : begin
if (LogonUser(PChar(login), PChar(Domain), PChar(Password),
LOGON32_LOGON_UNLOCK, LOGON32_PROVIDER_DEFAULT, phToken^)) then // логин юзера
begin
if (phToken^ <> 0) then
begin
pgContext.UserToken := phToken^;//!!!возвращаем winLogon`у
pdwOptions^ := 0;
pProfile := nil;
if (GetTokenInformation(phToken^, TokenStatistics, Pointer(@UserStats),
sizeof(TOKEN_STATISTICS), cbStats)) then //получаем AuthenticationId
begin
pAuthenticationId^ := Int64(UserStats.AuthenticationId);//!!!возвращаем winLogon`у
if (GetTokenInformation(phToken^, TokenGroups, nil,
0, cbGroups)) then //пытаемся получить размер для pGroups - уходит на "else"
begin
pGroups := PTokenGroups(LocalAlloc(LMEM_FIXED,cbGroups));
if (GetTokenInformation(phToken^, TokenGroups, pGroups,
SizeOf(PTokenGroups), cbGroups)) then
begin
SaveLogFile('WlxLoggedOutSAS_3b');
i := 0;
While i < pGroups.GroupCount do
begin
if (pGroups.Groups[i].Attributes = SE_GROUP_LOGON_ID) then
begin
SaveLogFile('WlxLoggedOutSAS_3c');
CopySid(GetLengthSid(pGroups.Groups[i].Sid), pLogonSid, pGroups.Groups[i].Sid);
SaveLogFile('WlxLoggedOutSAS_3d_pLogonSid: ' + IntToStr(Int64(pLogonSid)));
break;
end;
inc(i);
end;
end;
end else SaveLogFile('WlxLoggedOutSAS_Err:' + SysErrorMessage(GetLastError));
pMprNotifyInfo.pszUserName := DupString(login);
pMprNotifyInfo.pszDomain := DupString(domain);
pMprNotifyInfo.pszPassword := DupString(password);
pMprNotifyInfo.pszOldPassword := nil;
result := WLX_SAS_ACTION_LOGON;
end; //token
end;//not 0
end;//logon
end;//mrOK
idCancel : result := WLX_SAS_ACTION_NONE;
idAbort : result := WLX_SAS_ACTION_SHUTDOWN;
idRetry ://вызвать стандартный диалог
begin
Result := pfWlxLoggedOutSAS(pWlxContext, dwSasType, pAuthenticationId,
pLogonSid, pdwOptions, phToken, pMprNotifyInfo, pProfile);
end;
end;//case
end;//if
SaveLogFile('WlxLoggedOutSAS result='+IntToStr(Result)); //++
end;
Thank you very much!
any other codes?