﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-AICER-随笔分类-C/C++</title><link>http://www.cppblog.com/Squirrel/category/486.html</link><description>始有道，道生时空。时空，编程之阴阳。不得道者失时空，得道者时空盈余以完工。其有异乎？</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 13:16:37 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 13:16:37 GMT</pubDate><ttl>60</ttl><item><title>Windows凭据管理</title><link>http://www.cppblog.com/Squirrel/archive/2006/05/20/7445.html</link><dc:creator>Squirrel</dc:creator><author>Squirrel</author><pubDate>Sat, 20 May 2006 11:54:00 GMT</pubDate><guid>http://www.cppblog.com/Squirrel/archive/2006/05/20/7445.html</guid><wfw:comment>http://www.cppblog.com/Squirrel/comments/7445.html</wfw:comment><comments>http://www.cppblog.com/Squirrel/archive/2006/05/20/7445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Squirrel/comments/commentRss/7445.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Squirrel/services/trackbacks/7445.html</trackback:ping><description><![CDATA[   题目中的Windows凭据（Credential）其实就是指用户帐户和口令。最近项目中存在一台Windows（PC）机去管理服务器（Server），这之中就设计到服务器管理员权限的问题。需要用户对Windows上存储的用户名和密码进行管理。<br />   在Windows XP和Server 2003 中都已存在了“存储的用户名和密码”。在XP中，通过控制面板中的用户帐户-〉选择用户-〉管理我的网络密码。而在Server 2003中，则在控制面板下直接有“存储的用户名和密码”项。<br />   我们调用一些API，如WTSOpenServer，QueryServiceStatus，NetUserEnum等等涉及到RPC的，只要当前用户存储有目标远程机的权限合适的凭据，则这些API就不会因产生<font style="BACKGROUND-COLOR: #ffffff" color="#000000">ERROR</font>_ACCESS_DENIED而执行失败。因为我还不Windows的底层是如何进行控制的，比如，是否调用了SSPI，所以，执行这些API时，我只能向用户要管理员口令。但又不可能每次都让用户去输入一遍用户名和密码，那么，也就需要保存密码。<br />   既然保存了密码，就必须考虑删除密码，那么密码管理的问题也就来了。说到密码管理，我在前些年看电视的时候，看到介绍一个叫什么“网络螃蟹”的网站，他就是专门提供个人密码管理的，当时我就想，有人会去把自己的密码交给别人打理吗？这好像不大可能。何来也就没听到什么网络螃蟹横行的消息。<br />   现在我的项目中，如果用户有了一台机器（PC）的密码，那么，他就有了N台服务器的管理员权限。这当然是不被允许的了。怎么办？<br />   找了一些API，是Authentication Functions系列的。于是，下面一个小实验代码就是想来枚举用户凭据的。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">WinCred.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_52_1622_Open_Image" onclick="this.style.display='none'; Codehighlighter1_52_1622_Open_Text.style.display='none'; Codehighlighter1_52_1622_Closed_Image.style.display='inline'; Codehighlighter1_52_1622_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_52_1622_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_1622_Closed_Text.style.display='none'; Codehighlighter1_52_1622_Open_Image.style.display='inline'; Codehighlighter1_52_1622_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()</span><span id="Codehighlighter1_52_1622_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_52_1622_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  DWORD dwCount </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  PCREDENTIAL </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pCredArray </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL ;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_168_1559_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_1559_Open_Text.style.display='none'; Codehighlighter1_168_1559_Closed_Image.style.display='inline'; Codehighlighter1_168_1559_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_168_1559_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_168_1559_Closed_Text.style.display='none'; Codehighlighter1_168_1559_Open_Image.style.display='inline'; Codehighlighter1_168_1559_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">( CredEnumerate( NULL, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwCount, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pCredArray ) )</span><span id="Codehighlighter1_168_1559_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_168_1559_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_228_1526_Open_Image" onclick="this.style.display='none'; Codehighlighter1_228_1526_Open_Text.style.display='none'; Codehighlighter1_228_1526_Closed_Image.style.display='inline'; Codehighlighter1_228_1526_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_228_1526_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_228_1526_Closed_Text.style.display='none'; Codehighlighter1_228_1526_Open_Image.style.display='inline'; Codehighlighter1_228_1526_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">( DWORD dwIndex </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; dwIndex </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> dwCount; dwIndex</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_228_1526_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_228_1526_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      PCREDENTIAL pCredential </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> pCredArray[dwIndex];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      cout </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">*********************************\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Flags: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> pCredential</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Flags </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Type:  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">  pCredential</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Type </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Name:  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> pCredential</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">TargetName </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Persist: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> pCredential</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Persist  </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">User:  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">  pCredential</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">UserName </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      cout </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Data:  \r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> szHexBuffer[</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> szAsciiBuffer[</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> szHex[</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> szAscii[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      DWORD dwByte;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (dwByte </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; dwByte </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> pCredential</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CredentialBlobSize; dwByte</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_883_1461_Open_Image" onclick="this.style.display='none'; Codehighlighter1_883_1461_Open_Text.style.display='none'; Codehighlighter1_883_1461_Closed_Image.style.display='inline'; Codehighlighter1_883_1461_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_883_1461_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_883_1461_Closed_Text.style.display='none'; Codehighlighter1_883_1461_Open_Image.style.display='inline'; Codehighlighter1_883_1461_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span id="Codehighlighter1_883_1461_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_883_1461_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        BYTE byte1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> pCredential</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CredentialBlob[dwByte];<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        sprintf(szHex, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%2.2X </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, byte1);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        szAscii[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (byte1 </span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">32</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> byte1 </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          szAscii[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (UCHAR)byte1;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          szAscii[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        strcat(szHexBuffer, szHex);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        strcat(szAsciiBuffer, szAscii);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (dwByte </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> pCredential</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CredentialBlobSize </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> dwByte </span><span style="COLOR: #000000">%</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">16</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">15</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_1308_1452_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1308_1452_Open_Text.style.display='none'; Codehighlighter1_1308_1452_Closed_Image.style.display='inline'; Codehighlighter1_1308_1452_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1308_1452_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1308_1452_Closed_Text.style.display='none'; Codehighlighter1_1308_1452_Open_Image.style.display='inline'; Codehighlighter1_1308_1452_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_1308_1452_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_1308_1452_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%-50s %s\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, szHexBuffer, szAsciiBuffer);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          szHexBuffer[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          szAsciiBuffer[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      cout </span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">*********************************\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    CredFree( pCredArray );<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">system( "rundll32 keymgr.dll,KRShowKeyMgr");</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />   好像凭据数据还没能打出来。<br /><br />   后来，本着“编程的最高境界就是不编程”的精神，我想，如果直接把Windows的那个“存储的用户名和密码”对话框调出来用用不也可以吗。用ProcessExplorer，找到一个叫keymgr.dll的东西，嗯，估计对话框就在里面。<br />   在“运行”中输入“control keymgr.dll”或“rundll32 keymgr.dll,KRShowKeyMgr”，对话框就出来了。<br />   又省事了！<img src ="http://www.cppblog.com/Squirrel/aggbug/7445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Squirrel/" target="_blank">Squirrel</a> 2006-05-20 19:54 <a href="http://www.cppblog.com/Squirrel/archive/2006/05/20/7445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编程语言发展历程</title><link>http://www.cppblog.com/Squirrel/archive/2006/05/16/7252.html</link><dc:creator>Squirrel</dc:creator><author>Squirrel</author><pubDate>Tue, 16 May 2006 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/Squirrel/archive/2006/05/16/7252.html</guid><wfw:comment>http://www.cppblog.com/Squirrel/comments/7252.html</wfw:comment><comments>http://www.cppblog.com/Squirrel/archive/2006/05/16/7252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Squirrel/comments/commentRss/7252.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Squirrel/services/trackbacks/7252.html</trackback:ping><description><![CDATA[
		<img height="842" alt="LanguageRoadmap.jpg" src="http://www.cppblog.com/images/cppblog_com/squirrel/LanguageRoadmap.jpg" width="5950" border="0" />
<img src ="http://www.cppblog.com/Squirrel/aggbug/7252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Squirrel/" target="_blank">Squirrel</a> 2006-05-16 13:52 <a href="http://www.cppblog.com/Squirrel/archive/2006/05/16/7252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下 ACE中的地址重用</title><link>http://www.cppblog.com/Squirrel/archive/2006/05/15/7215.html</link><dc:creator>Squirrel</dc:creator><author>Squirrel</author><pubDate>Mon, 15 May 2006 10:51:00 GMT</pubDate><guid>http://www.cppblog.com/Squirrel/archive/2006/05/15/7215.html</guid><wfw:comment>http://www.cppblog.com/Squirrel/comments/7215.html</wfw:comment><comments>http://www.cppblog.com/Squirrel/archive/2006/05/15/7215.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Squirrel/comments/commentRss/7215.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Squirrel/services/trackbacks/7215.html</trackback:ping><description><![CDATA[   在ACE中，这个问题好像比较晦涩。<br /><br />   我所遇到过的问题是在ACE_SOCK_Dgram_Bcast的第4个构造参数reuse_addr赋值为1，但很遗憾，在Windows平台上，就是不能使端口重用生效。使用setsockopt来强制服用端口，仍然无效；用ACE_SOCK_Dgram也试过了，同样无效。ACE的代码中如是说：<br /><br />// If we are using winsock2 then the SO_REUSEADDR feature is broken<br />// SO_REUSEADDR=1 behaves like SO_REUSEPORT=1. (SO_REUSEPORT is an<br />// extension to sockets on some platforms)<br />// We define SO_REUSEPORT here so that ACE_OS::setsockopt() can still<br />// allow the user to specify that a socketaddr can *always* be reused.<br />                                                                               ——"config-win32-common.h"<br /><br />   在Winsock2中不支持SO_REUSEADDR, 可是我要用的只是端口重用而已。<br /><br />   不过ACE_SOCK_Dgram_Mcast倒是有效，可惜，不是一个概念。<br /><br />   我后来用很不爽的办法才应付过去，用socket函数先创建好SOCKET句柄后，再用ACE_SOCK_Dgram::set_handle设置。挺郁闷的，不知道有没有好的方法能解决或解释。<br /><img src ="http://www.cppblog.com/Squirrel/aggbug/7215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Squirrel/" target="_blank">Squirrel</a> 2006-05-15 18:51 <a href="http://www.cppblog.com/Squirrel/archive/2006/05/15/7215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>