• 2009-09-26

    Life is Good! - [生活点滴]

    今天好友推荐一首歌给我,《Life is Cool》,开始没有听懂,觉得听喧嚣的,不是我喜欢的风格。等看过她翻译的歌词后,在仔细听听,才发现这是一首非常励志和发人深省的歌。

    歌词的含义,跟我的blog原来的slogan的意义相互契合:

    Life is good,when you love it.

    是的,少点抱怨,积极生活,生活是美好的,即使你现在处于人生的最低谷,万事不顺;即使你梦寐以求的东西,别逼人轻易地获得;即使你被生活和工作压迫的够呛;即使你背负世人的眼光。即使你觉得一切都抛弃了你,但是生活没有。Life is Good,when you love it。是的,From a different point of view, 当你停止抱怨,停止自怨自艾,当你热爱生活,燃起生活的热情后,你会发现,Life is good!

    And the life you want
    Is the life you have to make

    请允许我转载这首歌和她的翻译:

    I never really try to be positive
    I'm too damm busy being negative
    So focused on what I get
    And never understand what it means to live
    You know we all love to just complain
    But maybe we should try to rearrange
    There's always someone
    Who's got it worse than you

     
    从未真正努力去积极的生活
    却因忙碌而处于消极的态度
    总是顾忌着自己的得失
    却从未理解生活的真谛
    我们都只是甘于抱怨
    但或许 我们应该尝试重新整理思绪
    想想毕竟总有那么一些人
    生活的比你还要糟糕

    My life is so cool
    My life is so cool
    From a different point of view
     
    我的生活其实挺(or酷)好的
    我的生活其实挺(or酷)好的
    换个角度看的话。。。

    We're all so busy tryin'to get ahead
    Got a pillow of fear when we go to bed
    We're never satisfied
    The grass is greener on the other side
    We get distracted by our jealousy
    Forget it's in our hands to stop the agony
    Will you ever be content
    On your side of the fence?
     
    我们都忙于走在人前
    连睡觉都头枕不安
    我们从未满足
    总觉得别人的生活更好些
    遂让嫉妒占据了我们的心
    却忽略了我们自己就可以结束这种痛苦
    难道你真的不能满足于自己的生活吗?

    Maybe you're the guy who needs a second chance
    Maybe you're the girl who's never asked to dance
    Maybe you're lonely soul
    A single mother sacred and all alone
    Gotta remember we live what we choose
    It's not what you say It's what you do
    And the life you want
    Is the life you have to make

     
    或许你是个需要再次重新选择的男孩
    或许你是个从未被邀请过共舞的女孩
    又或许你是个孤独的灵魂
    一个对生活充满恐惧却很孤单的单亲妈妈
    但是不要忘记我们的生活是自己选择的
    不凭你说了什么而是你做了什么
    所以想过怎么的生活就要努力奋斗!
  • 在上文中,我们介绍了操作系统服务的Session 0隔离,通过Session 0隔离,Windows 7实现了各个Session之间的独立和更加安全的互访,使得操作系统的安全性有了较大的提高。从操作系统服务的Session 0隔离尝到了甜头后,雷德蒙的程序员们仿佛爱上了隔离这一招式。现在他们又将隔离引入了同一个Session之中的各个进程之间,带来全新的用户界面特权隔离。

      用户界面特权隔离

       在早期的Windows操作系统中,在同一用户下运行的所有进程有着相同的安全等级,拥有相同的权限。例如,一个进程可以自由地发送一个Windows 消息到另外一个进程的窗口。从Windows Vista开始,当然也包括Windows 7,对于某些Windows消息,这一方式再也行不通了。进程(或者其他的对象)开始拥有一个新的属性——特权等级(Privilege Level)。一个特权等级较低的进程不再可以向一个特权等级较高的进程发送消息,虽然他们在相同的用户权限下运行。这就是所谓的用户界面特权隔离 (User Interface Privilege Isolation ,UIPI)。

      UIPI的引入,最大的目的是防止恶意代码 发送消息给那些拥有较高权限的窗口以对其进行攻击,从而获取较高的权限等等。这就像一个国家,原本人人平等,大家之间可以互相交流问候,但是后来坏人多 了,为了防止坏人以下犯上,获得不该有的权利,就人为地给每个人划分等级,等级低的不可以跟等级高的说话交流。在人类社会,这是一种令人讨厌的等级制度, 但是在计算机系统中,这却是一种维护系统安全的合适方式。

      UIPI的运行机制

      在Windows 7中,当UAC(User Account Control)启用的时候,UIPI的运行可以得到最明显的体现。在UAC中,当一个管理员用户登录系统后,操作系统会创建两个令牌对象(Token Object):第一个是管理员令牌,拥有大多数特权(类似于Windows Vista之前的System中的用户),而第二个是一个经过过滤后的简化版本,只拥有普通用户的权限。

      默认情况下,以普通用户权限启 动的进程拥有普通特权等级(UIPI的等级划分为低等级(low),普通(normal),高等级(high),系统(system))。相同的,以管理 员权限运行的进程,例如,用户右键单击选择“以管理员身份运行”或者是通过添加“runas”参数调用ShellExecute运行的进程,这样的进程就 相应地拥有一个较高(high)的特权等级。

      这将导致系统会运行两种不同类型,不同特权等级的进程(当然,从技术上讲这两个进程都是在同一用户下)。我们可以使用Windows Sysinternals工具集中的进程浏览器(Process Explorer)查看各个进程的特权等级。 (http://www.microsoft.com/technet/sysinternals)

      

      图1 进程浏览器

      下图展示了以不同特权等级运行的同一个应用程序,进程浏览器显示了它们拥有不同的特权等级:

      图2  不同特权等级的同一应用程序

      所以,当你发现你的进程之间Windows消息通信发生问题时,不妨使用进程浏览器查看一下两个进程之间是否有合适的特权等级。

     

    阅读全文:VS与Win7 共舞:用户界面特权隔离

  • 甲型H1N1流行,人人谈隔离而色变。好在我们今天谈的不是H1N1的隔离,而是系统服务的Session 0的隔离。

      隔离,是为了更好的保护。但是,众所周知的,隔离也会给我们的生活带来一些不便。在Windows 7中,操作系统服务的Session 0隔离,阻断了系统服务和用户桌面进程之间进行交互和通信的桥梁。通过Session 0隔离,虽然可以让操作系统更加安全,但是也给系统服务带来了不少兼容性的问题。

            系统服务在Windows 7上遇到的问题

      操作系统服务是Windows操作系统中一套完整的机制。服务不同于普通用户程序之处在于,你可以配置服务,让它们从系统启动时开始运行直到系统关闭,而整个过程无需用户参与。操作系统服务负责所有无需用户参与的后台活动,从远程过程调用(PRC)到网络位置识别服务等等。

       虽然操作系统服务在执行过程中无需用户参与,但是,有些服务可能需要向用户显示一些用户界面以反馈消息或者是跟用户应用程序进行通信。这种服务在 Windows 7中将遇到一些兼容性问题。比如,在Windows 7中,当你的服务尝试向用户显示一个消息对话框时,你将只会看到在任务栏上的一个图标,而无法正常地看到服务想要显示的对话框。确切地讲,你的服务可能会 遇到下面这些千奇百怪的问题:

      • 虽然服务在运行,但是没干任何它应该干的事情

      • 虽然服务在运行,但是其他进程却无法与之通信

      • 当你的服务试图通过Windows消息与用户应用程序进行通信时,消息却无法到达应用程序

      • 当你的服务试图与桌面进行交互时,仅仅在任务栏上显示一个闪动的图标,无法进行正常的用户交互

      以上这些问题,实际上都是因为Windows 7的系统服务Session 0隔离而引起的。这些问题大致可以分为两类:

      • 服务无法正确显示用户界面或者仅仅显示一个提示界面

       当一个服务想在桌面显示任何用户界面的时候(即使它被容许跟桌面进行交互),一个缓冲层会用“Interactive Service Detection”对话框提示用户,询问是否需要显示来自服务的用户交互界面。虽然用户可以选择继续查看来自服务的用户界面消息,但是,工作流的被中 断,使这成为一个严重的应用程序兼容性问题。例如,下面的代码视图在服务中显示一个对话框:

    DWORD WINAPI TimeServiceThread(LPVOID)
    {
          
    // 进入服务循环
        while (!g_Stop)
        {
            DWORD dwResponse
    = 0;

            Sleep(
    5000);
            
            
    // 显示对话框
            dwResponse = MessageBox(NULL,
                 L
    "这是一个从Session 0显示的对话框",
                 L
    "Session 0隔离", MB_YESNO);

            
    if (dwResponse == IDNO)
                
    continue;    //

            
    //
        }

        
    return 0;
    }

      如果我们在服务属性中,配置服务不可以与桌面进行交互,我们将看不到任何对话框,即使我们在服务中配置它可以与琢磨进行交互,它也会被“Interactive Service Detection”对话框打断,使得工作流被中断。

      图1  设置系统服务属性

      图2  系统服务显示消息对话框

      • 服务和应用程序所共享的对象变得不可见或者是不可访问

       当服务创建的对象被一个普通应用程序(以普通用户权限运行)访问的时候,在全局名字空间中将无法找到这个对象(这是因为它是Session 0所私有的)。另外,即使对象是可见的,为了与之通信,其他进程的安全性也要做相应的改变。这将会影响到其他进程,比如普通用户权限运行的应用程序与服务 之间的交互。

     

    阅读全文:VS与Win7共舞:系统服务的Session 0隔离

  • 呵呵,记得当时年纪小。。。

     

    Anyhow, happy birthday to myself, fighting!

     

  • 强烈抗议,IT168的编辑一点幽默感都没有,把我的文章修改的味同嚼蜡。

    “快说,你是不是安装程序?”操作系统问。

      “我不是啊,长官。我虽然长得像,但是我真的不是安装程序啊!”,一个应用程序扮出一副可怜相,胆胆怯怯的回答道。

      “不是?那为什么你的程序名中含有Install?”,操作系统以怀疑的眼光盯着他,“所有程序名中含有Install的应用程序都是安装程序,都必须在执行的时候都向用户请求管理员权限!”

      “是是是,长官!”应用程序心中暗喜,操作系统主动给我机会让我请求管理员权限,我求之不得呢,用户早就厌烦UAC了,肯定直接点击“YES”了事啊,有了管理员权限,我就可以为所欲为啦,偷偷修改个首页先,哈哈哈哈~~~

      UAC又惹祸了

       随着Windows Vista引入UAC(User Access Control)机制,默认情况下,应用程序都运行在普通用户权限下。虽然微软出于良好的愿望而在Vista中引入UAC机制, 但是在Vista操作系统中,只要系统稍作改变,它就会频繁弹出对话框来寻求用户的许可,因此它成为了Vista中最受痛恨的一个功能。 虽然如此,Windows 7还是继承了这一机制并根据用户的反馈做了相应的改进。为了降低计算机系统的风险,UAC机制将执行应用程序的用户权限降低了,这就为那些在UAC机制出 现之前所设计的应用程序的执行带来了兼容性的麻烦。这些旧有应用程序通常都假设以管理员权限运行,在Windows 7上,因为UAC的存在,这一假设不成立了,最终导致应用程序无法正常运行。一些应用程序确实是需要管理员权限才可以正常运行的,尤其是安装程序,他们需 要向一些需要特殊权限的区域,比如“Program Files”或者是注册表的HKEY_LOCAL_MACHINE写入内容,这种情况它们会遇到访问拒绝的错误,或者是数据被UAC Virtualization重定向到其他位置而无法正确执行。

      为了解决这个问题,“聪明”的雷德蒙程序员们想出了一个办法:安装程序 检测。从Windows Vista开始,当然也包括Windows 7,操作系统将采用一些启发式算法来判断应用程序是不是一个安装程序,也就是在执行的时候这个程序是否需要请求管理员权限,如果操作系统判断应用程序是一 个安装程序,就会让它在执行的时候向用户请求获取管理员权限以便让应用程序正确的执行。

      操作系统是如何检测的?

       所有在Windows Vista之前开发的没有manifest(包括外部的和内部的)的32位应用程序都会进行这种启发式的安装程序检测。操作系统会假设这些应用程序是旧有 的,他们都需要进行安装程序检测以确定这些应用程序是否管理员权限才能正常运行。面对这样的应用程序,操作系统的启发式安装检测通常会通过以下这些途径来 判断一个32位应用程序是不是安装程序:

      • 文件名包含关键字:”install”, “setup”和”update”等等。

       • 在版本资源的以下字段内包含关键字:厂商(Vendor)、公司名(CompanyName)、产品名(ProductName)、文件说明(File Description)、初始文件名(Original Filename)、内部文件名(Internal Name)、导出名(Export Name)。

      • 在可执行文件的manifest内包含关键字。

      • 在链接到可执行文件的特定StringTable中包含关键字。

      • 在链接到可执行文件的资源文件数据包含关键属性。

      • 可执行文件包含特定的字节序列。

      如果找到了,操作系统会认为它需要管理员权限才可以正常运行。一个UAC保护盾的图标会覆盖在应用程序图标上,这就表示应用程序在启动的时候会请求管理员权限以便它可以正确执行。

      

      图1 安装程序检测

    阅读全文:Win7共舞:UAC惹祸 如何进行安装程序检测?