2008年4月29日星期二

在Windows服务中以SYSDBA无需密码登录本地Oracle

  因为客户的特殊需求,导致我们要在一个Windows服务中以SYSDBA权限去访问本地的Oracle数据库,并且不能输入任何密码。通常情况下,当Windows的用户帐号是ORA_DBA组成员时,直接用sqlplus "/ as sysdba"的方式就可以登录本地Oracle数据库,无需输入sys的用户名和密码。因此我计划用这种方式来实现无密码登录Oracle。但是得到了如下的错误信息:
  ORA-01031: insufficient privileges
  很明显,权限方面出了问题。想想也应该,我们的Windows服务使用的应该是NT AUTHORITY/SYSTEM(S-1-5-18)的权限在运行。于是方案A出台了。

方案A:将SYSTEM帐户加入ORA_DBA组。

  从UI是看不到SYSTEM帐户的,只有用命令行的方式加。
net localgroup ORA_DBA system /add
  结果还是得到了ORA-01031。分析了一下,有可能是因为操作系统认证需要从操作系统的用户帐号来进行,而SYSTEM帐号是个内置帐号,在用户管理里面是看不到的。于是这个方案宣告失败。

方案B:切换到别的帐户运行。
  基本上,方案A走不通的话,那就只有这种办法了。首先是建立一个Windows帐户,并加入ORA_DBA组中。密码自己随便定一个就好。
net user dbauser 1qaz2wsx /add
net localgroup ORA_DBA dbauser /add
  但是具体怎么切换呢?

方案B.1:用runas切换帐户。
  一般RunAs服务(也就是Secondary Logon)都是启动的,所以首先想到用Windows 2000/XP/2003自带的命令runas来实现。
runas /user:dbauser "sqlplus \"/ as sysdba\" ……"
  没报错,可是没反应。噢,麻烦来了。这个runas命令是要问密码的。
  上Google找了一下解决方案。试了一下用vbs的SendKeys那种,手动状态下似乎勉强可行,但要放在Windows服务中,没戏。因为它毕竟是模拟客户端的输入来键入密码的。有个自称可以让runas支持管道输入密码的小工具sanur也没戏,看起来它俩的原理是类似的。

方案B.2:用第三方工具替代runas切换帐户。
  既然runas这条路走不通,就彻底抛开它另寻出路了。
  有个工具lsrunas自称可以替代runas,于是下载下来一试。虽然参数比较罗嗦,但的确是可以替代。不过这个替代也仅限于通常情况下,一旦放到我们的Windows服务中,就没有反应了。
  另外有人推荐了一个cpau。这个工具还是不行,不过它倒是留下了一个提示信息,这个信息成了重要的线索:
  ERROR: CPAU doesn't support running from LocalSystem.
  看来还是SYSTEM的权限问题。

方案B.3:自写工具切换帐户。
  看来这些工具都没问题,但是应该都不支持在SYSTEM的权限下面切换用户。听说以前某个同事也为这个问题研究了好些天,最后还是放弃了。老实说,听到这个我有一点绝望。
  这SYSTEM权限吧,说它低,却能操作很多系统级别的东西。可要说它高呢,有些本来很容易的事情它又做不了。不过理论上还是认为SYSTEM的权限比较“高”,很多黑客都以获得SYSTEM权限为目标在半肉鸡上奋斗着。于是,我以SYSTEM降权为主要话题,去黑客站点看了看。
  还真是有收获,得到了一段代码,是一个利用API自己实现的runas工具程序。在命令行下使用了一下,感觉挺好,比Windows那个runas好用多了。
  不过,放进Windows服务里面,还是不行。真的是快绝望了。

方案B.4:用API直接切换帐户。
  由于我们的系统有现成的接口用来启动一个PipeCmd,所以到目前为止我都是用它去运行了一个批处理,然后在批处理中干上述事情。该接口其实是用CreateProcess实现,因此新建的进程就继承了父进程的权限,也就是SYSTEM。
  但,在那段黑客代码中,其实切换帐户是使用了CreateProcessWithLogonW来完成。估计各个工具都类似,因此应该可以跳过中间的多余步骤,用API切换帐户来直接运行sqlplus。
  经过多次实验,总算是成功了:
HANDLE hToken;
LogonUser("dbauser", NULL, "1qaz2wsx", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken);
STARTUPINFO si;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
PROCESS_INFORMATION pi;
CreateProcessAsUser(hToken, NULL, cmdbuf, &sa, NULL, TRUE, NULL, NULL, NULL, &si, &pi);

  想偷懒的人还是看看代码稍微理解一下吧,因为我也想偷一下懒,直接拷可能会有问题的。另外说明一下,CreateProcessWithLogonW应该是也可以做到,但是我一直没能成功。倒是CreateProcessAsUser一次成功,于是就这样用下去了。

  本来在这里就应该作结了,不过后面还有一点小插曲:这段代码在Windows 2000/XP上可以运行得很好,但是在2003上有问题。在2003上用这种方式运行sqlplus的时候看起来一切正常,但sql的内容没有被执行。最终的解决方案是把dbauser也给加到了Administrators组里面。
net localgroup Administrators dbauser /add
  但是在XP下面要这样做的话,就有可能会让Windows把dbauser当成了主管理员,特别是在某些装好之后默认用Administrator用户登录的系统上。这样会给用户带来不小的困扰哦,所以最佳的做法应该是判断一下操作系统的版本再做相应处理。

2008年4月18日星期五

我的4月银行新动向

Chapter One

  申请金卡的时候额度完全没有调整,于是以为是被拒了。昨天早晨,突然收到短信通知说上调到15K,正是我申请的额度。看来是两个线程啊。
  由于VISA普卡上绑了两个代扣费,不敢销卡,因此只好把额度调低点收藏起来。还好我现在刷卡次数很多,养这些卡完全没有问题。下面要做的事情就是找家人的附卡了。

Chapter Two

  上周末招行上海分行系统升级。升完级之后刚好遇到发工资,在转帐的时候意外地发现原本0.2%的异地快速汇款手续费变成0.1%了。翻遍了网页也没有找到相关的说明,姑且理解为新平台上线的优惠吧。

Chapter Three

  月初的时候,不小心把招行VISA普卡的额度调成了0。结果很可能导致了移动那边代扣话费失败,收到了警告短信。由此看来,我对招行在推销此业务时宣传的什么“独立额度”在理解上还有问题。
  打10086和8008205555咨询了半天,最后还是让我等本月20日左右的那次补扣。有点担心会不会再出问题,于是去上海移动的网站看了看。又是很意外地发现上海移动居然开通了很多家银行的网上缴费业务,招商银行信用卡也赫然在支持之列。进去看了看,是普通的网付界面,于是顺便就把费给缴了,不知道有没有积分了。
  从此,又多了一种缴费途径。很好!

Chapter Four

  在新的招行网银上逛,发现信用卡下面多了一个缴费的菜单。进去看了看,除了重庆之外别的地方好像都还没怎么开展此业务。但重庆的电信和移动费用都可以用信用卡支付了。再次很好!什么时候水电费能用这个缴了就更好了。

ATM换假钞?傻子才相信!

  终于在网上看到这类“骗局”了。说实话,有点惊诧于始作俑者的无良,更惊诧于跟风者的无知。
  存取款循坏ATM机这玩意儿刚一出现,我就考虑过这个问题了。首先,ATM的取款Cancel会不会经过验钞器,这是一个问题。更明显的问题在于,银行根本不会给你这个机会让你调包。这个所谓的“漏洞”其实根本不存在!
  真正有脑子的人,稍微一想就可以明白这个道理。如果可以换假钞,那就说明取款Cancel的时候验钞器没有起作用。那样的话岂不是还可以换冥币,换纸片,什么都可以换了。如果不经过验钞,银行凭什么要把取走的款项归还到卡上?难道是根据退回去东西的重量吗?
  其实,银行这种机构,对于交易的事务性绝对是第一看重的。如果自动操作的流程不能完全保证事务性,那么宁可转成线下操作手工处理,也不会让钱帐不齐。所以银行肯定会先把卡上的余额给扣掉再吐钱。再加上还有摄像头提供线索,于是几个去尝试的倒霉蛋,全部都进了局子。个人认为,他们出来之后应该把发帖人和论坛给告上一状。
  很令我感慨的是,好些跑去尝试的家伙,都是在校大学生。诚然,学生没有经济来源,所以对钱方面更看重。但是作为曾经代表了我国高级知识分子的大学生群体,这不能不说是很令人遗憾的事情。我可以理解为他们好奇且愤青,但是有些事情是犯法的是不能做的,难道他们不知道吗?对法律有不同意见,欢迎努力腐败成为“人大代表”之后去立新法。对银行服务有意见的,有本事像抵制家乐福一样去抵制啊?我真的对他们,很失望!

2008年4月1日星期二

忙碌且倒霉的三月终于完了

  近来发生了许多事情,不过根本没有时间和机会写博,真是可惜。大致说说近况吧。
  从3月11日起,连续出差了三次,都是为了同一个事情。
  第一次出差接近于被拐卖,说是去开个会,一两天就回,结果被告知要好好地“辛苦”上一段时间。无奈之下,只好让莉莉代我去给那套房东很牛X的房子下了定金。房子还不错,价格也还合适,这一出起差来,大概是没机会看别的房子了,只有这样吧。
  定了房子,稍稍安了心。让公司支援,派了个同事过来帮忙,周末花一天时间溜回上海签约,然后又火速赶回北京继续工作。想想我的工作还是挺神圣的,起草国家标准呢!又写了一个星期,大致成形了,于是奉命回上海。这次稍微呆得久了一点,一个比较完整的周末加两天工作日。有三天的时间在搬家及处理我房子的事情,还有接近一天的时间回到公司开了N个会。然后又去北京。
  这第三次出差的时候,票骤然紧张。去的时候十万火急地买了飞机票,写了三天后再回来的时候居然根本买不到票了。当天的没有,第二天的也没有,最后只好买了周日的动车回上海。不能躺就不能躺吧,好歹总算是回来了。