2008 七月 | Bring me my guts on a silver platter.


CDU大学无线网络的设置(新来的同学不会设置的请进)

Category: Windows相关

一般新来同学带来的笔记本应该驱动都是装好的, 如果自己有重装过系统的, 请先确定无线网卡的驱动已经装上, 如果找不到的话可以去电脑品牌的官方网站下载, 或者去驱动之家 http://www.mydrivers.com  也可以找到.

我买吃的去, 回来继续写.


好, 继续写.

 

一. 安装补丁

首先安装一个Windows XP的WPA2无线网络补丁.

有些笔记本自带的XP就已经补过这个补丁了, 或者电脑上已经装着Vista系统的同学, 就不需要了, 可以跳过这一步直接去看设置部分了.

这个补丁是用来使XP的无线网络设置支持WPA2标准的, 不补的话也一样可以上, 但是据我个人感觉补过了能稳定一些, 而且据说会增强无线信号(没做过对比测试). 
WPA2 补丁 下载地址:

英文版: http://www.k4ng.com/WindowsXP-KB893357-v2-x86-ENU.exe

中文版: http://www.k4ng.com/WindowsXP-KB893357-v2-x86-CHS.exe

请根据自己系统的语言来选择.

 

二. 设置无线网络

这里讲的设置都是以Windows XP为标准的, Vista的设置也大同小异.

1. 首先断开你当前的无线网络连接(因为设置之前显然是连不上的, 一直连也是白连..)

2. 开始菜单 -> 设置 -> 控制面板 ->  网络连接 在 无线网络连接 上点右键, 点属性. (见图一)

图一

图一

3. 单击 无线网络配置 选项卡, 如果有看到CharlesDarwinStudents 一项, 请单击选中, 然后点 删除. (见图二)

image

图二

4. 然后单击 添加 , 网络名后面写入 CharlesDarwinStudents (无空格, 要一模一样)

网络验证 选择WPA2, 数据加密 选择AES. (图三)

image

图三

5. 单击 验证 选项卡, EAP类型 选择 受保护的EAP(PEAP), 将下面的 当计算机信息可用时验证为计算机 前的勾去掉. (图四)

image

图四

6. 单击 EAP类型右下方的 属性 , 将 验证服务器证书 前的勾去掉. 选择验证方法 安全密码(EAP-MSCHAP v2) 并将下面的 启用快速重新连接 前的勾勾上. (图五)

image

图五

7. 单击 选择验证方法 右侧的 配置, 将 自动使用Windows登录名和密码(以前域, 如果有的话) 前的勾去掉. (图六)

image

8. 点两次 确定.

9. 单击 连接 选项卡, 在 当此网络在区域内时连接 前面打勾. (图七)

image

图七

10. 单击两次 确定. 退出 无线网络连接 属性 窗口.

11. 双击屏幕最下方任务栏的 无线网络连接 图标, 单击 查看无线网络. 再单击 刷新网络列表, 单击 CharlesDarwinStudents (不是CharlesDarwinStaff, 图里点错了)点下方的, 连接 (图八)

image

图八

12. 然后屏幕右下角会出一个小气泡对话框 在它上面单击 (图九)

image

图九

13. 在出现的窗口中输入你的学生号以及你internet access的密码. (图十)

image

图十

14. 等待连接成功.

 

三. 浏览器代理设置

CDU的上网有一个登录脚本代理, 需要手工设置在浏览器里才可以登录外网, 否则只能上校内网络. 这里只讲IE的设置, FF及其它浏览器设置大同小异. (我的IE是英文的..大家凑合看)

1. 打开IE, 单击菜单栏中的 工具 -> Internet选项 -> 单击 连接 选项卡 -> 单击 窗口下方的 局域网设置. 在新出现的窗口中 将 自动检测设置, 使用自动配置脚本都勾选上, 并在地址中填入  http://proxy.cdu.edu.au/  将下方的 使用代理服务器 也勾选上 并在地址中填入 kingfisher.cdu.edu.au 端口 80 (图十一)

image

图十一

2. 单击两次确定, 把Internet 选项窗口关闭.

3. 在浏览器地址栏中 输入 10.0.0.10 回车. 在出现的对话框中 输入你的学生号和上网的密码. (可以把记住密码勾上, 免得以后总要重输) 单击确定, 会提示你 LOGIN Successful! 

4. 到这里, 就大功告成了, 可以开始浏览网站下载软件…了.

 

四. QQ及迅雷代理设置

现在国内应该说几乎没有不用QQ和迅雷的, 所以把代理设置方法也说一下. 这里以最新版本QQ和迅雷为例.

1. QQ

打开QQ, 单击登录窗口处的 设置. 在网络设置中, 类型后面 选择 HTTP代理, 地址后填入 kingfisher.cdu.edu.au 端口 80   之后就可以开始输入帐号密码正常登录了. (图十二)

image

图十二

2. 迅雷

迅雷的设置很简单, 只要之前在IE里设置好代理后, 打开迅雷 单击菜单栏的 工具 -> 使用IE代理 就可以了. (图十三)

image

图十三

 

好了, 到这里基本在CDU大学上无线网络的相关设置就都讲完了, 以后可能陆续会有补充.



如果你忘记了DotnetNuke站点的host和admin密码…

Category: 代码相关

今儿在办公室发生一很无语的事, 有关我的一个DNN(dotnetnuke)项目的. 这个项目是几个月前开始做的, 一个Project Issue Registration System, 后台数据库都已经做完了, 只剩下网站前台, 由于这是个公司的内部项目, 后来的几个网站都是政府还有其它公司的, 优先级比较高, 所以一直在做后来的项目而把这个就一直撂置了, 这几天刚刚把后来的项目都sign off了, 开始有闲, 准备把这个PIRS捡起来做完.

结果把项目打开一运行就傻了, 这是个基于DNN框架的网站, 我把host和admin密码全忘了, 因为当初也是还在开发阶段, 所以根本没设别的用户, 试遍了我自己常用的密码组合, 还有公司的密码组合, 全不行.. 直接无语.  由于host密码不能用密码找回找到, 所以只能走数据库这一步了.

上SQL server, 进去了直奔dbo.aspnet_Membership, 密码是带salt和DNN自己另设的密文加密的, 我头脑一热加手一抖直接把admin和host的密码和salt删了, 然后想用其它站数据库里的密码和salt复制过来, 结果没用, 然后又用hash generator 做了数个加密后的密文+ salt 复制过去, 依然无效. 然后突然想起来,  DNN的加密机制不太一样, 每个DNN站的web.config里自己有个独特的密文, 不同站的不一样, 这一下直接不能上了. 这回事情比原来还严重了, 不仅密码忘了, 原来的密码也没了, salt也没了. -.-|||

OK, 事已至此, 咱上google上找一下先吧, 别自己再乱搞了. 搜索一下, 还真找出不少方案来. 后来才知道, 这些方案在我目前的情况下都不适用, 不过那是后话, 我先把这些解决办法列出来, 方便一下看这篇文章的人.

 

方案一

这个理论上适用于所有情况(但是实际上是痴人说梦..)

  1. 在你DNN网站上注册一个新用户. 如果你的注册按钮被你在站点设置里关掉了, 那就去SQL server上把dbo.Portals表里的UserRegistration值改成2.
  2. 用你开的registration建个新用户(把密码记住.. -.-|||)
  3. 再进数据库, 找到dbo.ASPNet_Membership表
  4. 到你新建的那个用户那一行中把password, passwordsalt的密文都复制到你的host用户那一行的同样列中(host是superuser).
  5. 重新用你的host和你新设用户的密码登录DNN然后再把你新建的那个用户删掉就可以了.

很不幸的是, 我的DNN网站的出于当初开发时的安全考虑被我关闭了, 而且他所说的改UserRegistration值的方法是无效的, 改过后Register依然没有在login module中出现.

 

方案二

这个是需要你已经知道一个帐号的用户名和密码, 然后用下面的SQL query实现对host的密码的替换.

1
2
3
4
5
SELECT password, passwordformat, passwordsalt
FROM aspnet_membership am 
INNER JOIN aspnet_users auON (au.userid = am.userid) 
INNER JOIN aspnet_applications aaON (au.applicationId = aa.applicationid)WHERE au.username = 'admin' 
AND aa.applicationname = 'DotNetNuke'

 

然后把你得到的password, passwordformat, passwordsalt复制到一个地方, 下面的query中从’TestUser’那行开始, 分别对应 用户名, password, passwordsalt, ChangeTime, passwordFormat. 所以你用你刚复制下来的替换下面这几个就可以了.

 

1
2
3
4
5
6
7
8
9
DECLARE @changeDate datetime
SET @changeDate = getdate()
--set the password
exec aspnet_Membership_setPassword 'DotNetNuke', 
'TestUser', 
'DM1tZvBjM+27Eck5eI1TWFeG42XuJnMuin3jqFOtMjS83RN6d7dFbQ==', 
'4e5Bb5jOOMYu/JFXVdRmlA==',
@changeDate, 
2

 

那么很不幸的, 这个方案也是无效的因为我根本没有任何一个知道密码的帐号.而且据我所知DNN 4.4.1以后的版本也不再使用Application ID了, 而是使用Application Name. 所以这里也需要做些小修改才能生效.

 

方案三

在SQL server 运行这个query

1
2
3
4
5
6
7
8
9
10
11
12
Declare @UserName NVarChar(255)
Declare @NewPassword NVarChar(255)
Declare @PasswordSalt NVarChar(128)
Declare @Application NVarChar(255)
-- 在下面的单引号间输入你要做的修改(用户名, 密码)
-- 别留任何空格除非你特意要留..
SET @UserName = 'admin' -- 这个是DNN默认的admin用户, 这里我们要改成host
 
SET @NewPassword = 'newpassword' -- 这里是你的新密码
SET @Application = (SELECT [ApplicationID] FROM aspnet_Users WHERE UserName=@UserName)
SET @PasswordSalt = (SELECT PasswordSalt FROM aspnet_Membership WHERE UserID IN (SELECT UserID FROM aspnet_Users WHERE UserName=@UserName))
Exec dbo.aspnet_Membership_ResetPassword @Application, @UserName, @NewPassword, 10, 10, @PasswordSalt, -5

根据这个query来看, 这也是一个DNN 4.4.1以前的方案,但是我做了小量修改, 依然不能在新版本的DNN上有任何效果. 因为他是基于你没有删SALT的基础上的, 而很不幸, 我把密码+SALT都删没了.  失败.

 

方案四

这个是一个老外的query, 无数老外跟着comment了说好用, 但是很不幸, 他的原理是跟方案一相同的, 也需要你有一个已知密码的帐号, 只不过用query的形式完成了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
DECLARE @databaseName VARCHAR(128)
SELECT @databaseName = DB_NAME()
 
PRINT 'RESET PASSWORD IN DATABASE : ' + @databaseName
PRINT '-----------------------------' + REPLICATE('-', DATALENGTH(@databaseName ));
 
DECLARE @knownUserName NVARCHAR(128)
DECLARE @lostUserName NVARCHAR(128)
DECLARE @lostUserId NVARCHAR(128)
DECLARE @knownPassword NVARCHAR(128)
DECLARE @knownSalt NVARCHAR(128)
 
SET @knownUserName = 'Tonic'
SET @lostUserName = 'host'
 
SELECT @knownPassword = Password, @knownSalt = PasswordSalt
FROM aspnet_Membership
INNER JOIN aspnet_users
ON aspnet_Membership.UserId = aspnet_users.UserId
WHERE UserName = @knownUserName;
 
PRINT ''
PRINT 'Known Password for "' + @knownUserName + '" is : ' + @knownPassword
PRINT 'Known Password Salt for "' + @knownUserName + '" is : ' + @knownSalt
 
SELECT @lostUserId = aspnet_Membership.UserId
FROM aspnet_Membership
INNER JOIN aspnet_users
ON aspnet_Membership.UserId = aspnet_users.UserId
WHERE UserName = @lostUserName;
 
PRINT ''
PRINT 'UserID for "' + @lostUserName + '" is : ' + @lostUserId
PRINT ''
 
IF (DATALENGTH(@lostUserName) <= 0 OR @lostUserName IS NULL)
PRINT 'Invalid Lost User Name ' + @lostUserName
ELSE BEGIN
IF (DATALENGTH(@knownUserName) <= 0 OR @knownUserName IS NULL)
PRINT 'Invalid Lost User Name ' + @lostUserName
ELSE BEGIN
IF (DATALENGTH(@knownPassword) <= 0 OR @knownPassword IS NULL)
PRINT 'Invalid Known Password ' + @knownPassword
ELSE BEGIN
IF (DATALENGTH(@knownSalt) <= 0 OR @knownSalt IS NULL)
PRINT 'Invalid Known Salt ' + @knownSalt
ELSE BEGIN
PRINT ''
PRINT 'BEFORE'
SELECT LEFT(UserName, 12) AS UserName, aspnet_Membership.UserId, LEFT(Email, 20) AS Email, Password, PasswordSalt
FROM aspnet_Membership INNER JOIN aspnet_users ON aspnet_Membership.UserId = aspnet_users.UserId
WHERE UserName IN ( @knownUserName, @lostUserName );
PRINT ''
PRINT 'Changing Password for User Id : "' + @lostUserId + '" to "' + @knownPassword + '"'
PRINT ''
UPDATE aspnet_Membership
SET Password = @knownPassword,
PasswordSalt = @knownSalt
-- SELECT UserId, Password, PasswordSalt
-- FROM aspnet_Membership
WHERE UserId = @lostUserId;
PRINT ''
PRINT 'AFTER'
SELECT LEFT(UserName, 12) AS UserName, aspnet_Membership.UserId, LEFT(Email, 20) AS Email, Password, PasswordSalt
FROM aspnet_Membership INNER JOIN aspnet_users ON aspnet_Membership.UserId = aspnet_users.UserId
WHERE UserName IN ( @knownUserName, @lostUserName );
END
END
END
END
GO
PRINT '' PRINT ' * * * END OF SCRIPT * * *' PRINT '' GO

显然, 前面已经提过, 我没有一个现成的知道密码的帐号, 所以再次失败.

方案五

由于我之前的失败都因为没有一个可以工作的而且知道密码的帐号, 而又不能在网站上注册新帐号, 于是我找到了一个方法可以用SQL创建一个新帐号.

query如下

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
SELECT m.password, m.passwordsalt, m.passwordformat
FROM aspnet_users u
    INNER JOIN aspnet_membership m
        ON (u.userid = m.userid)
WHERE u.UserName = 'TestUser'
SELECT PortalId,
     PortalName
FROM Portals
DECLARE @ApplicationName nvarchar(256)
SET @ApplicationName = 'DotNetNuke'
DECLARE @UserName nvarchar(256) 
SET @UserName = 'NewUser' --The new user
DECLARE @Password nvarchar(128)
--From the existing user
SET @Password = 'LLSXX8xW6+0EbrV4JBzL/YenA1D6BBfRnkYY7FtQvNGmmPOhVdPiAA=='
DECLARE @PasswordSalt nvarchar(128)
--From the existing user
SET @PasswordSalt = 'P40ky5tExsx37nUIFnCWZQ=='
DECLARE @Email nvarchar(256)
SET @Email = 'TestingAccount@test.com' --You can set this to whatever you want
DECLARE @PasswordQuestion nvarchar(256)
SET @PasswordQuestion = ''
DECLARE @PasswordAnswer nvarchar(128)
SET @PasswordAnswer = ''
DECLARE @IsApproved bit
SET @IsApproved = 1
DECLARE @CurrentTimeUtc datetime 
SET @CurrentTimeUtc = GETDATE()
DECLARE @CreateDate datetime
SET @CreateDate = @CurrentTimeUtc
DECLARE @UniqueEmail int
SET @UniqueEmail = 0
DECLARE @PasswordFormat int
SET @PasswordFormat = 2 --NOTE: Value from existing user!
DECLARE @PortalId int
SET @PortalId = 0    --The id of your portal
Declare @UserId uniqueidentifier
DECLARE @DNNUserId int
 
--Make the stored procedure call
EXEC dbo.aspnet_Membership_CreateUser @ApplicationName, @Username, @Password,
                @PasswordSalt, @email, @passwordquestion, @PasswordAnswer, 
                @IsApproved, @CurrentTimeUtc, @CreateDate, @UniqueEmail,
                @PasswordFormat, @UserId
 
--Insert the record into the DotNetNuke users table
INSERT INTO users (Username, FirstName, LastName, IsSuperUser, Email,
                    DisplayName, UpdatePassword)
    VALUES(@Username, 'My', 'NewAccount', 0, @Email, 'New Account', 0)
 
--Get the new userid, from the DNN users table
SELECT @dnnuserid = userid
FROM Users
WHERE username = @Username
 
--Now, insert the record into the user portals table
INSERT INTO UserPortals (userId, PortalId, CreatedDate)
    VALUES(@dnnuserid, @PortalId, GETDATE()) 
 
--Now Give the user permissions to the RECISTERED Users group
INSERT INTO UserRoles (userId, roleId)
SELECT @dnnuserid,
        roleId
FROM Roles
WHERE RoleName = 'Registered Users'

然而我不得不再次不幸的告诉大家, 从这个query来看, 要使用这个query建立一个DNN新用户, 也是需要事先有一个知道密码, salt, applicationname的帐户才可以的, 可悲的是我的密码和salt密文已经被我完全删干净了. 再次失败.

 

成功方案

 

经过了这数次失败以后, 我终于放弃google了, 看来这次真的无法找到我要的答案, 既然数据库方向我无法找到结果, 那么只能从代码上动手脚了, 不就是想注册新用户么, 我开始找login module的code.

image 

DNN的这个目录下存放着login module的代码, 打开后开始查找对portal setting里Userregistration属性的判定, 经过一翻查找和测试, 总算找到了, Page_Load里面的这一段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            If Not Request.IsAuthenticated Then
                If Page.IsPostBack = False Then
                    Try
                        If Not Request.QueryString("username") Is Nothing Then
                            txtUsername.Text = Request.QueryString("username")
                        End If
                        If Not Request.QueryString("verificationcode") Is Nothing Then
                            If PortalSettings.UserRegistration = PortalRegistrationType.VerifiedRegistration Then
                                ' Comment this line above and the "End If" below out if you can't login as admin or host 
                                '   and can't change the register setting in SQL and don't even have an password-known account 
                                '   and really really desperatly want to register a new user.   -- Kang 10.07.2008
 
                                'Display Verification Rows 
                                rowVerification1.Visible = True
                                rowVerification2.Visible = True
                                txtVerification.Text = Request.QueryString("verificationcode")
                            End If
                        End If
 
                    Catch
                        'control not there 
                    End Try
                End If

这段代码中的comment是我加的.. (当时实在很无语), 判定网站是否开放注册的部分就是其中If PortalSettings.UserRegistration = PortalRegistrationType.VerifiedRegistration Then 和下面的End IF这两行, 我把他们前面加个’ 给comment掉再重新编译运行网站,  register就出来了, 之后我把自己新注册的用户在数据库中的superuser设成true(dbo.Users表里面), 然后用这个帐号登录DNN, 把host和admin的salt随便写一个在数据库里加上, 再把他俩的密码reset, 然后重新change password为我想要的, 大功告成. 本来也可以用上面几个方案中给出的换密码的办法, 不过看了这么久的query我实在不想再弄了, 直接去万恶的DNN后台里改了.

希望对跟我一样犯了愚蠢错误的DNN开发人员有所帮助.

真的很长啊, 谢谢观赏.



iPhone 3G 澳洲网上定购开始

Category: IT相关

Vodafone 和 Optus公司将会在七月十一号同时开始售出iPhone 3G, 而Vodafone今天已经开始offer iPhone 3G版的网上定购了.

Vodafone 网上定购页面:

image

http://store.vodafone.com.au/iphone/

Optus 的iPhone3G页面:

image

http://www.optusiphone.com.au/home.aspx

 

Vodafone没有对pre-pay的iPhone 3G 裸机出售进行说明, 而是推出了大量为iPhone 3G 量身定做的Cap Plan和Business Plan.  Optus 则列出了pre-pay用户不绑定任何plan的裸机购买价:

iPhone 3G 的8G版本 为 $729 澳元

iPhone 3G 的16G版本为 $849 澳元

具体plan什么的就没什么可说的了,怎么算都是宰人的价, 就像贷款30年买房自己住然后只还利息一样… 有钱还是买裸机, 这玩意不像房子动辄几百万, 几百块一般人还是拿得起的. -.-|||

而且所有这些Vodafone plan都没有能把credit用来打国际长途的,  Optus的pre-pay也不能打, 我国际长途打得通常比国内的电话多, 另外我还是比较喜欢有键盘的电话,  所以还是继续用我的pre-pay.. 然后继续等待年底或者明年年初的HTC Android系统电话吧.



有关于Notepad++作者 boycott 北京奥运的一些看法

Category: IT相关

Notepad++ 是一款很不错的免费且开源的文本编辑程序, 由老外写的Slite基础上修改完善而来, 是一名台湾程序员侯今吾制作并发布的, 在SourceForge的文本编辑器上排名第一, 很长久的一段时间以来我一直在使用它进行我日常的编辑工作, 除了一些在IDE里完成更简便的活以外, 写php, html, css, 基本都是用notepad++ .

可是最近一次更新软件的过程中, 却突然发现Notepad++ 作者在Notepad++的主页上公然宣布将抵 制北京奥运会, 我很惊讶, 首先点击了他的解释, 他自己的解释是由于中国政府对西藏问题的处理他觉得不满意, 看过以后我为他感到遗憾. 这确实不是一个理智的选择.

中国自己的国土, 中国怎样对待是中国政府的事情, 不是他一个人可以干涉得了的, 而且西方媒体将中国妖魔化, 对中国双重标准对待已经不是一天两天的事情了, 只因为一些负面宣传而做出这种行为实在不是明智之举. 北京奥运会是全中国人民的事情, 我觉得做为一个中国人, 无论从哪个方面来说, 我们都要支持它, 不应该因为一些负面的思想或者报道而对自己的民族产生疑问, 我跟我很多老外同事聊过奥运会, 西藏以及很多其它西方媒体报道的事, 这几个同事大多是30-50岁有丰富西方生活阅历的工程师, 他们普遍认为中国在处理事情上没有什么值得本国人甚至很多外国人如此反感的地方, 而且每年的奥运会前后总是会麻烦不断, 也并不只是中国才这样, 很多时候就是有很多媒体会因为奥运会而去蓄意诽谤主办国. 

从另一个角度来讲, 做为一个技术人员, 政治因素不应该如此无理智的穿插到你的产品中来, 侯今吾的作法无疑使Notepad++失去了大量的用户, 而这些用户不会仅国内用户, 国外的大量Notepad++使用者也会因此而永远的从硬盘里delete掉它.

发现Notepad++ Boycott 北京奥运的事实后, 我就直接把它从硬盘里删除了, 虽然用了这么久, 但是做为一个有民族自尊感的中国人…我觉得任何人都会毫不犹豫的这样做. 优秀的文本编辑器实在是太多了, 比如我以前一度使用的UltraEdit, 虽然要付费, 但是让我用一个boycott 北京奥运的软件, 我宁愿去付那50美元买个别的来用.

话说回来..我上次用UltraEdit已经是好多好多年前了,使用功能也仅限于用他的HEX编辑器, 现在更新换代的后的UltraEdit真是好用, 以前Notepad++的死穴就是搜索功能, 一碰到大量代码中的搜索, 它经常要搜很久, 而UltraEdit里, 不管文件多大, 几乎是一秒内就能到达, 钱还真的是不白花.

推荐所有还在用Notepad++的朋友, 换用其它文本编辑器吧, 我并不是号召大家抵制Notepad++, 2008这一年, 我们已经"举国震怒"了太多次, "抵制"了太多东西, 我们不需要喊出声, 不需要动怒, 要的只是看完这篇文章后, 去notepad++的网站上看一看, 然后把他默默的从硬盘上删掉, 就可以了.

维护北京奥运会, 是我们每个中国人的义务.