解开拒绝本地登录的“死结”

在Windows 2003环境下,被组策略拒绝本地登录一直是件比较令人头疼的事情。本文将介绍一种所有用户都被拒绝本地登录后的解决方法。
  在Windows2003中,如果某个用户被取消了本地登录权限,当这个用户本地登录计算机时,系统就会提示“此系统的本地策略不允许您采用交互式登录”,导致登录失败。遇到这种情况,通常请管理员在组策略中重新设置一下,将该用户从“拒绝本地登录”列表中删除或添加到“在本地登录”列表中即可。但如果因为操作失误或其它方面的原因,我们将所有用户的本地登录权限都禁止了(通常是禁止了users组(非域环境下)或domain users组(域环境下)),那就有点麻烦了。这种情形看起来像一个解不开的“死结”:要解除禁止本地登录的组策略设置,必须以管理员身份本地登录;要以管理员身份本地登录,就必须先解除禁止本地登录的组策略设置。但实际上,事情并没有我们想象的那么糟。经过查询相关资料和测试,我发现借助网络的帮助,这个“死结”还是可以解开的。因为域安全策略与本地安全策略的数据保存机制不同,下面分两种情况分别进行说明。
被域策略拒绝本地登录时的解决办法
  域策略的安全设置部分都保存在一个名为“GptTmpl.inf”的安全模板中,这是一个文本文件,存放在DC(域控制器)的SYSVOL(物理目录指向DC的“c:\winnt\sysvol\sysvol”)共享中。要解除对所有用户本地登录限制,在不能本地登录的情况下,最快捷的办法可能就是直接编辑这个文本文件。
  具体操作如下:
  1.. 在另一台计算机(Win9X/2000/XP均可)上,使用域管理员账号连接到DC的SYSVOL共享,在“\\\sysvol\\Policies\GUID>\MACHINE\Microsoft\Windows NT\SecEdit”下找到该文本文件“GptTmpl.inf”。(路径中的“DC name”是你放置该组策略的域控制器的名字,“Domain name”是你的域的名字,“Policy GUID”是你要编辑的组策略的GUID,类似于“{31B2F340-016D-11D2-945F-05C04FB98439}”)。
  2.. 使用记事本打开“GptTmpl.inf”文件,找到文件中“PrivilegeRights”小节下的“SeDenyInteractiveLogonRight”关键字,它的值就是被拒绝本地登录的用户或组的SID,将这些SID删除,使“SeDenyInteractiveLogonRight”关键字的值为空。修改完毕将文件保存回原位置。
  3.. 使用记事本打开位于“\\\sysvol\name>\Policies\”下的“GPT.INI”文件,提高“General”小节下的“Version”关键字的值,通常是加1000。这是我们修改的这个组策略的版本号,版本号提高后可以保证我们的更改被复制到其它DC上。修改完毕将文件保存回原位置。
  4.. 域策略刷新后,问题即告解决。
  5.. 本地登录DC重新设置域策略中的相关项目 。

被本地安全策略拒绝本地登录时的解决办法
  解决被本地安全策略拒绝本地登录的最正统的方法,应该是使用另一台Windows2000计算机,使用组策略MMC管理单元通过网络连接到故障计算机的本地安全策略,然后进行修改。但我测试后发现,使用这种方法成功的机率非常小(具体的原因也不十分的明了),不是连接不上故障计算机,就是打不开故障计算机上本地安全策略的安全设置。因此我们还需要一个更稳妥些的解决方法。
  本地安全策略的安全设置通常存放在一个二进制的安全数据库secedit.sdb中,这个安全数据库的结构我们无从知道,因此象第一部分那样直接编辑secedit.sdb文件的办法是无能为力了,我们需要采用迂回进攻的策略,“曲线救国”。
  具体操作如下:
  1.. 假设故障计算机的IP地址是”192.168.0.111″。在另一台计算机(Windows9X/2000/XP均可)上,使用“Telnet 192.168.0.111”命令使用管理员账号连
接到故障计算机。(如果故障计算机的“telnet”服务没有启动,可以通过网络启动,具体方法不在详述)
  2.. 通过telnet在故障计算机上执行“net share tmp$=d:\tmp”命令,将故障计算机上的“d:\tmp”隐藏共享为“tmp$”,共享权限缺省是everyone完全控制(此时要特别注意网络安全)。当然你也可以共享其它的目录。
  3.. 通过telnet在故障计算机上执行“secedit /export /CFG
d:\tmp\sec.inf”命令,将故障计算机的本地安全策略配置导入“d:\tmp\sec.inf”安全模板文件中,这是一个文本文件。
  4.. 连接到故障计算机上的tmp$共享,用记事本打开共享文件夹中的“sec.inf”文件。找到文件中“Privilege Rights”小节下的“SeDenyInteractiveLogonRight”关键字,它的值就是被拒绝本地登录的用户或组的SID,将这些SID删除,使“SeDenyInteractiveLogonRight”关键字的值为空或者是随便另设置一个无关的值。文件修改完毕保存回原位置。
  5.. 通过telnet在故障计算机上执行“secedit /configure /db
c:\secedit.sdb /CFG d:\tmp\sec.inf”命令,使用新的安全模板和安全数据库重新配置故障计算机的本地安全策略。
  6.. 通过telnet在故障计算机上执行“secedit /refreshpolicy
machine_policy /enforce”命令,强制在故障计算机上刷新策略设置,问题即告解决。
  7. 本地登录故障计算机后,删除我们建立的Tmp$共享,重新设置本地安全策略中的相关项目。

  secedit简介
  Secedit.exe,Windows2000自带的自动化安全配置任务命令行工具,功能强大。我们可以用它来分析系统的安全性、配置系统安全性、刷新安全性设置、导出安全性设置和验证安全配置文件。它的具体用法请使用“secedit /?”查看其帮助文件。

  补充说明
  上面所说的两种方法,都是以有权限用户(如管理员)没有被禁止从网络登录为前提的,如果你的策略把从网络登录也禁止了,让故障计算机成了真正的“孤家寡人”,那问题解决起来要麻烦的多,但同样不是一个解不开的“死结”。具体的解决办法,我会另具文说明,在此不再细说。

Posted in Windows, 操作系统 | Tagged , , | Leave a comment

JavaApplet (转)

http://baike.baidu.com/view/533192.htm

Applet可以翻译为小应用程序,Java Applet就是用Java语言编写的这样的一些小应用程序,它们可以直接嵌入到网页中,并能够产生特殊的效果。包含Applet的网页被称为Java-powered页,可以称其为Java支持的网页。
当用户访问这样的网页时, Applet被下载到用户的计算机上执行,但前提是用户使用的是支持Java的网络l浏览器。由于Applet是在用户的计算机上执行的,因此它的执行速度不受网络带宽或者Modem存取速度的限制。用户可以更好地欣赏网页上Applet产生的多媒体效果。
在Java Applet中,可以实现图形绘制,字体和颜色控制,动画和声音的插入,人机交互及网络交流等功能。 Applet还提供了名为抽象窗口工具箱(Abstract Window Toolkit, AWT)的窗口环境开发工具。 AWT利用用户计算机的GUI元素,可以建立标准的图形用户界面,如窗口、按钮、滚动条等等。目前,在网络上有非常多的Applet范例来生动地展现这些功能,读者可以去调阅相应的网页以观看它们的效果。 <BR>Applet的工作原理.
含有Applet的网页的HTML文件代码中部带有<applet> 和</applet>这样一对标记,当支持Java的网络浏览器遇到这对标记时,就将下载相应的小应用程序代码并在本地计算机上执行该Applet。

编辑本段例子

带有一个Applet的主页
<html>
<title> An Example Homepage </title>
<h1> Welcome to my homepage! </h1>
This is an example homepage, you can see an applet in it。
<p> <br>
<applet code=“Example.class” width = 300 height=300>
<param name = img value=”example.gif”>
</applet>
</html>
上面这个例子就是一个简单主页的HTML文件代码。代码第五行中的<p>,是为了确保Applet出现在新的一行,若没有它, Applet将会紧接着上一行的最后一个单词出现。代码第六、七两行是关于Applet的一些参数。其中第六行是必需的Applet参数,定义了编译后的包含Applet字节码的文件名,后缀通常为“.class”;和以象素为单位的Applet的初始宽度与高度。第七行则是附加的Applet参数,它由一个分离的标记来指定其后的名称和值,在这里是img的值为“example.gif’,它代表了一个图形文件名。
Applet的下载与图形文件一样需要一定的时间,若干秒后它才能在屏幕上显示出来。等待的时间则取决于Applet的大小和用户的网络连接的速度。一旦下载以后,它便和本地计算机上的程序以相同的速度运行了。
Applet在用户的计算机上执行时,还可以下载其它的资源,如声音文件、图像文件或更多的Java代码,有些Applet还允许用户进行交互式操作。但这需要重复的链接与下载,因此速度很慢,这是一个亟待解决的问题,可以想到的一个好办法是采用类似高速缓存的技术,将每次下载的文件都临时保存在用户的硬盘上,虽然第一次使用时花的时间比较多,但当再次使用时,只需直接从硬盘上读取文件而无需再与Internet连接,便可以大大提高性能了。
import java.awt.*;
import java.applet.*;
public class HelloApplet extends Applet{
public void paint(Graphics g){
g.drawString(“Helloworld!”,50,25);
}
}
<!–程序文件名称为HelloApplet.html–>
<HTML>
<HEAD>
<TITLE>  HTML Test Page
</TITLE>
</HEAD>
<BODY>
HelloApplet will appear below in a Java enbaled broswer.<BR>
<APPLET
CODEBASE=”.”
CODE = “HelloApplet.class”
NAME = “TestApplet”
WIDTH = 400
HEIGHT = 300
HSPACE = 0
VSPACE = 0
ALIGN = middle
>
</APPLET> 
</BODY>
</HTML>

//

Posted in 软件测试 | Leave a comment

转 java 进程与线程的区别

以下内容摘自

http://www.cnblogs.com/200911/archive/2012/07/16/2594143.html

进程与线程

理解进程与线程:

1.DOS有一个明显的特点,就是一旦病毒入侵,系统就会死机,因为传统的DOS系统是单进程处理方式,所以只有一个程序运行,其它程序无法运行。

而windows系统中,即使出现病毒,系统照样可以使用,因为windows系统是采用多进程处理方式,在同一个时间段上会有多个程序在运行。

2.对于word来说每次启动一个word实际上都是在操作系统上分配一个进程。而线程实际上是在进程的基础上进一步划分,从word来看可以把拼写检查当做一个线程进行处理。当然会同时存在多个线程。

3.如果一个进程没有了,线程一定会消失;但线程消失了,进程未必会消失。而且线程都是在进程的基础上并发同时运行。

4.下面来看进程与线程的概念:

进程是程序的动态执行过程,它经历了从代码加载,执行,到执行完毕的一个完整过程。这个过程也是进程本身从产生、发展,到最终消亡的一个过程。

多线程是实现并发机制的一个有效手段。进程和线程一样都是实现并发的基本单位。

理解多线程:如果现在同时有多个任务,则所有的系统的资源是共享的,被所有线程所公用,但是程序处理需要CPU,传统单核CPU来说同一个时间段会有多个程序执行,但是在同一个时间点上只能存在一个程序运行,也就是说所有的程序都要抢占CPU资源。但是当CPU已经发展到多核的状态了,在一个电脑上可能会存在多个CPU,这个时候就可以非常清楚的发现多线程操作间是如何进行并发的执行的。

5.java实现多线程:

两种方式:(1)继承Thread

      (2)实现Runnable接口

先调用start方法,在执行run方法。这是为什么呢?打开Thread的类定义,在jdk的src.zip中全部是java的源程序代码,直到找到java.lang.Thread类的定义:

  public synchronized void start(){

      if(threadStatus != 0)

    throw new IllegalThreadStateException();

  start0();

  if(stopBeforeStart){

    stop0(throwableFromStop);

  }

  }

 private native void start();

 start()方法可能抛出异常。

stopBeforeStart是一个boolean型变量,native关键字表示由java调用本机操作系统函数的一个关键字。在java中,运行java程序调用本机的操作系统的函数已完成特定的功能。

证明:如果现在要想实现多线程的话,则肯定需要操作系统的支持,因为多线程操作系中牵涉到一个抢占CPU的情况,要等待CPU进行调度,这一点肯定需要操作系统的底层支持,所以使用了native调用本机的系统函数。而且在各个操作系统中实现底层代码肯定是不同的,所以使用native关键字也可以让JVM自动调整不同的JVM实现。

threadStatus也表示一种状态,如果线程已经启动了在调用start方法的时候就有可能产生异常。

继承Thread实现多线程:

  class myThread extends Thread{

    private String name;

    public myThread(String name){//通过构造方法配置name属性

      this.name = name;

    }

    public void run(){//重写run方法

      for(int i = 0;i<10; i++){

        System.out.println(name +”运行,i=”+i);

      }

    }

  }

   public class ThreadDemo{

    public static void main(String []args){

      myThread mt1 = new MyThread(“线程A”);//实例化对象

      mt1.start();//调用线程主体

      mt1.start();//异常

    }

  }

 Runnable接口:在java中可以通过实现Runnable接口的方式实现多线程,Runnable接口中只定义了一个抽象的方法。public void run();

在Runnable中并没有start()方法,那么怎样才能使用start()方法呢?在Thread类中有构造方方法public Thread(Runnable target ){}利用此构造方法启动多线程。

 class MyThread implements Runnable{

  private String name;

  public MyThread(String name){

    this.name = name; 

  }

  public void run(){

    for(int i = 0;i<10;i++){

      System.out.Println(name+”运行,i = “+i);

    }

  }

 }

public class myThreadDemo{

  public static void main(String []args){

    MyThread mt1 = new MyThread(“线程A”);//实例化对象

    MyThread mt2= new MyThread(“线程B”);

    Thread t1 = new Thread(mt1);//实例化Thread类对象

    Thread t2 = new Thread(mt2);

    t1.start();//启动多线程和

    t2.start();

  }

}

 Thread类与Runnable接口的联系:

  Thread 定义:

  public class Thread extends Object implements Runnable 发现Thread类也是Runnable接口的子类,使用了代理的机制完成。

Thread类与Runnable接口的区别:

     使用Thread类操作多线程的时候无法达到资源共享的目的,而使用Runnable接口实现的多线程操作可以实现资源共享。

Thead类与Runnable接口的使用结论:

实现Runnable接口比继承Thread类有如下明显的优点:

  (1)适合多个相同程序的代码的线程去处理同一个资源。

  (2)可以避免由于单继承局限所带来的影响。

  (3)增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。  

线程的状态:

  创建状态:准备好了一个多线程对象:Thread t = new Thread();

  就绪状态:调用了start()方法,等待CPU进行调度。

  运行状态:执行run方法

  阻塞状态:暂时停止执行,可能将资源交给其他线程使用。

  终止状态:(死亡状态):线程执行完毕了,不再使用了。

Posted in 软件测试 | Leave a comment