Home

2014年1月22日 星期三

透過 BGInfo 搭配群組原則顯示正確的環境資訊

From: Polin Wei

軟體下載:BgInfo v4.12

一、安裝
直接解開壓縮檔之後,放在你想要的目錄下,執行程式就可以了。基本上預設提供的東西有點多,因 此我就按照我所需要的調整一下,看起來也清楚些。也可以按照右下方的一些選項按鈕,把訊息調整到你想到的地方。調整好之後可以透過上方的 Menu 選擇 「File」→「Save As…」將設定檔儲存起來。

由於這些檔案希望在網域內的電腦都能套用,因此把設定檔放到 C:\Windows\SYSVOL\sysvol\wei.com\scripts 的目錄下,中間紅色的部分就看您的網域名稱是甚麼,改成對應的就是了。所以我把整個目錄,連同檔案和設定檔案都一併複製到這個目錄之下。

二、設定

1) 接下來我們要建立一個 Script,希望透過群組原則讓每台網域內的電腦都可以執行,因此我們先建立一個批次檔「SetBGInfo.bat」,內容如下:
cmd /c
@echo off
%logonserver%\NETLOGON\BGinfo\BGinfo.exe %logonserver%\NETLOGON\BGinfo\BGinfo.bgi /timer:0 /nolicprompt

或者
cmd /c
@echo off

copy %logonserver%\NETLOGON\BGinfo\BGinfo.exe %systemroot% /y

copy %logonserver%\NETLOGON\BGinfo\BGinfo.bgi %systemroot% /y

%systemroot%\BGinfo.exe %systemroot%\BGinfo.bgi /timer:0 /nolicprompt 



2) 在主機上先測試一下看 Script 是否可行,並且把這個執行檔案找一台有加入網域的電腦測試一下,看看有沒有路徑名稱拚錯或者是有沒有任何執行上的異常,如果沒有的話,那麼我們就可以到群組原則上來做相關設定了。

3) 在主機上開啟「群組原則管理」,選擇我們所在的網域,按下滑鼠右鍵,選擇「在這個網域中建立 GPO 並連結到…」的選項

4) 建立新的一組群組原則,這裡指定為 BGInfo

5) 按下確定之後,會回到群組原則管理,此時會出現我們剛剛所建立的那一組 BGInfo,於是點選該組設定,按下滑鼠右鍵,選擇「編輯」

6) 選擇「電腦設定」→「原則」→「Windows 設定」→「指令碼」→「啟動」,按下滑鼠右鍵再選擇「內容」

7) 選擇下方的「顯示檔案」,把最前面產生的 SetBGInfo.bat 的檔案複製過來 ( 不是移動,因為等下還有地方需要這個檔案 ),複製好後就可以關閉檔案總管的視窗,選擇上圖畫面中右邊的「新增」按鈕。

8) 此時可以按下右邊「瀏覽」的按鈕,就可以選擇到前一個步驟所放置的 SetBGInfo.bat 了。按下「確定」就完成了電腦設定。

 9) 接下來用同樣的方式,在到「使用者設定」→「原則」→「Windows 設定」→「指令碼」→「登入」,按下滑鼠右鍵再選擇「內容」,接下來的步驟就跟前面從電腦設定的步驟都相同了。

10) 設定完之後,我們會開啟一個 DOS 視窗,指定執行   「gpupdate /force」,將群組原則強制更新。

BGInfo 進階設定:網卡的顯示

1) 利用自訂欄位的方式來做處理,因此選擇右方的「Custom」的選項 

2) 選擇「New」,給一個新屬性的名稱,因此我這裡命名為「Active IP Address」,使用「WMI Query」的方式去取資料,選好後按下下方「Browse」來選擇 WMI 的指令。


3) 在這裡我們 WMI Class 挑選「Win32_NetworkAdapterConfiguration」,屬性選擇「IPAddress」,此時出來的也會有一堆是 null 的資料,因此我們在 WMI Query 後面再加上一段判斷式「WHERE IPEnabled = True」,這樣就會只剩下我們有在使用的 IP 資訊了。 

4) 設定好新的自訂屬性之後,接下來我們重新調整一下原本 BGInfo 的設定值,將原本的 IP Address 給刪除,改用我們新設定的「Active IP Address」 


BGInfo 進階設定:取得 Firefox Version

1) 依上面的作法, 增加用 Registry value 取得值的方法來取得, 其 Key 值為:
HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox\CurrentVersion

參考:
http://www.dotblogs.com.tw/jamesfu/archive/2013/04/15/bginfo.aspx

2014年1月15日 星期三

AD Account Login Linux Server (oracle linux 與 Windows AD 帳號認證整合)

From: Polin Wei

為了在Windows主機間達到資源共享的目的,微軟發展出 SMB(Server Message Block)通訊協定,利用其網路芳鄰共享檔案系統及印表機等資源;而Samba在Linux主機上實現SMB通訊協定的系統,達成Windows與 Linux主機的資源共享,再搭配 Winbind 模組解決 Samba 中統一登入問題。因為 Linux Server 愈來愈多,為了可以達到統一單一帳號來達到管理,因此; 接下來我們要利用 samba、winbind 來整合 AD 帳號,這樣我們就可以在 AD 管理帳號就可以了。

環境:

Windows Server 2003 AD Server: ADSERVER.WEI.COM (192.168.2.1)

Oracle Linux R6.5 for x86_64 (64 Bit) :cvs.wei.com (192.168.2.69)

一、Linux 相關套件安裝與設定

1) 在安裝 Linux 主機時,可以選取相關的套件


2) 檢查/驗證一下相關的套件是否有裝
[root@cvs ~]# rpm -qa | grep samba
samba-common-3.6.9-164.el6.x86_64
samba-client-3.6.9-164.el6.x86_64
samba4-libs-4.0.0-58.el6.rc4.x86_64
samba-winbind-3.6.9-164.el6.x86_64
samba-3.6.9-164.el6.x86_64
samba-winbind-clients-3.6.9-164.el6.x86_64

[root@cvs ~]# rpm -qa | grep winbind
samba-winbind-3.6.9-164.el6.x86_64
samba-winbind-clients-3.6.9-164.el6.x86_64

[root@cvs ~]# rpm -qa | grep krb5
krb5-workstation-1.10.3-10.el6_4.6.x86_64
krb5-server-1.10.3-10.el6_4.6.x86_64
pam_krb5-2.3.11-9.el6.x86_64
krb5-libs-1.10.3-10.el6_4.6.x86_64

3) 使用 UI 工具來作設定
 設定好後 Apply,然後記得要在 Identity & Authentication 按下 Join Domain,在 AD 的 Computers 中應該可以看到此 Linux : cvs 主機

4) 啟動 Samba & Winbind Services

5) 最後使用 AD Domain User 來作登入測試,應該就可以成功了。

6) 若有目錄要給 AD Domain Users 群組可以使用, 可以用指令 # chown -R root:"WEI\Domain Users" /opt/cvs_root/ 來賦予.

Oracle Linux 在使用 samba、winbind 來整合 AD 帳號的 UI 畫面已經整合的非常好,/etc/samba/smb.conf & /etc/krb5.conf 都不需去多作編輯:只有 /var/kerberos/krb5kdc/kdc.conf 檔案內容中的 EXAMPLE.COM 要改成您的 AD 網域(如:WEI.COM),以及將 master_key_type 前的 # 去除即可。相關檔案如下:

[root@cvs samba]# cat /etc/samba/smb.conf
#======================= Global Settings =====================================

[global]
#--authconfig--start-line--

# Generated by authconfig on 2014/01/15 15:41:06
# DO NOT EDIT THIS SECTION (delimited by --start-line--/--end-line--)
# Any modification may be deleted or altered by authconfig in future

   workgroup = WEI
   password server = ADSERVER.WEI.COM
   realm = WEI.COM
   security = ads
   idmap config * : range = 16777216-33554431
   template shell = /bin/bash
   winbind use default domain = false
   winbind offline logon = true

#--authconfig--end-line--

[root@cvs samba]# cat /etc/krb5.conf
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = WEI.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 EXAMPLE.COM = {
  kdc = kerberos.example.com
  admin_server = kerberos.example.com
 }

 WEI.COM = {
  kdc = ADSERVER.WEI.COM
 }

[domain_realm]
 .example.com = EXAMPLE.COM
 example.com = EXAMPLE.COM

# vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 WEI.COM = {
  master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }


2014年1月10日 星期五

CVS Server in Linux & Jdeveloper OAF in Window 開發環境的整合設定

From: Polin Wei

整合環境:
JDeveloper OAF in Windows 8:
Patch 17888411 for Oracle EBS R12.2.3
PC IP: 192.168.3.116

CVS Server in Oracle Linux:
R6.4 Kernel: 2.6.39-400.17.eluek.x86_64
Server IP: 192.168.3.50
HostName: oradb12clinux

一、安裝CVS
一般 Oracle Linux 已經內含 CVS 的套件[ cvs-1.11.xx(x86_64) & cvs-inetd-1.11.x(noarch) ],在安裝時記得勾選即可,若忘記勾選,等系統安裝完再從光碟安裝也可以。

1.先查看是否安裝 cvs,一般安裝在 /usr/bin/cvs
# which cvs
/usr/bin/cvs

# rpm -qa | grep cvs
cvs-1.11.23-15.el6.x86_64
cvs-inetd-1.11.23-16.el6.noarch

二、建立 Users and Groups
1. 建立cvs user group,便於管理cvs User
#groupadd cvs
2. 建立cvsroot User,屬於 cvs 群組,根目錄為/opt/cvs,不允許 login
# useradd -M -g cvs -s /sbin/nologin cvs <- br="" cvs="" home:="" home="" user="">
3. 若需要建立 anonymous 帳號
# useradd -M -s /sbin/nologin anonymous

4. 將系統內其他會使用到 cvs 的 User 加入到 cvs 的 Group 中
# vi /etc/group
cvs:x:501:polinwei,anonymous,cvs

三、設定環境變數
# vi /etc/profile.d/cvs.sh 
export CVSROOT=/opt/cvs_root
export CVS_RSH=ssh (為了在 Windows 平台上的 JDeveloper 連入, 使用 SSH 連結較安全)

立即生效此環境變數
1) 重新登入
2) # export CVSROOT=/opt/cvs_root

四、建立目錄,改變/opt/cvs_root 的目錄屬性
# mkdir /opt/cvs_root
# chmod 775 /opt/cvs_root

五、初始化 Repository
# cvs init ( 或 # cvs -d /opt/cvs_root init ) <- br="" cvs_root="" cvsroot="" opt=""># chown -R root:cvs /opt/cvs_root
 
若是沒有指定 $CVSROOT 環境變數則使用下列參數
# cvs -d :localhost:/opt/cvs_root init

因為用 local 的模式在用 cvs,所以不用登入(login)
-d 是指定 CVSROOT 路徑,如果沒設環境變數就要使用此參數
init 代表要初始化 /opt/cvs 這個目錄

六、設定 xinetd
1) 在 /etc/xinetd.d/ 內已有 cvs 的設定檔
# vi /etc/xinetd.d/cvs
service cvspserver
{
        disable = no
        port                    = 2401
        socket_type       = stream
        protocol              = tcp
        wait                    = no
        user                    = root
        passenv              = PATH
        server                 = /usr/bin/cvs
        env                     = HOME=/opt/cvs_root
        server_args        = -f --allow-root=/opt/cvs_root pserver
        bind                    = 192.168.3.50
}
紅色的部份要注意,env 參數必須跟你所放置 CVS 目錄的位置一樣,server_args為登入時會用到的目錄名,bind 的 IP 改成您 Linux Server 的 IP。

2) 重新啟動 xinetd 並啟動 CVS Server
# service xinetd restart
# chkconfig cvs on
3) 檢查cvspserver服務是否已經啟動
# netstat -l |grep cvspserver

其結果如下:
tcp   0  0 oradb12clinux:cvspserver  *:*    LISTEN

七、登入
若要使用其它使用者的話,指令: cvs -d :pserver:user_name@ip_address:/opt/cvs login
# cvs -d :pserver:polinwei@localhost:/opt/cvs_root login
Logging in to :pserver:cvs@localhost:2401/opt/cvs
CVS password:
cvs [login aborted]: connect to [localhost]:2401 failed: Connection refused
# cvs -d:pserver:polinwei@oradb12clinux:/opt/cvs_root login
Logging in to :pserver:polinwei@oradb12clinux:2401/opt/cvs_root
CVS password:
[root@oradb12clinux CVSROOT]#
若正確則會直接回到 # 提示符號,表示 CVS Server 已正常運作

(繼續閱讀...)

2014年1月3日 星期五

Oracle Database 11g new feature : Example for Interval partitioning

From: Polin Wei

人工的方式去區隔了不同年代 tables ,以 DB 的作法,可以參考 Interval Partitioning ,固定一個區間,以月,或是年,自動去做分割 table ,可簡化人工介入的處理動作。

Title: Example for Interval partitioning - new feature in 11g
Version: 7
Created on: August 27, 2010 9:38 PM by LajosV - Moderator - Oracle
Last Modified: April 18, 2013 6:34 PM by LajosV - Moderator - Oracle
Viewed: 425 times
Since 11g, the new feature Interval partitioning makes it possible that the database automatically creates interval partitions as data for that partition arrives. 

We can establish interval partitioning on a table with: 

    • - CREATE TABLE statement for a new table, or
    • - ALTER TABLE statement for an existing ranged partitioned table.

In both cases the table needs to have at least one range partition (this is defined by the PARTITION clause).

The INTERVAL clause establishes interval partitioning for the table, here we set the interval for new partitions, which must be a
fix interval (e.g. Day, Month, Year). 

The range partitioning key value determines the high value of the range partitions, which is called the transition point, and the database automatically creates interval partitions for data beyond that transition point. The lower boundary of every interval partition is the non-inclusive upper boundary of the previous range or interval partition.

The INSERT (data load) part of the following example is based on the Sales History (SH) demo schema. 

create table t_part (
    col_date date,
    col_text varchar2(100),
    col_number number(10))
    PARTITION BY RANGE (col_date)
     INTERVAL(NUMTODSINTERVAL(1, 'DAY'))
    (
      PARTITION P_200105 VALUES LESS THAN (TO_DATE(' 2001-06-01', 'YYYY-MM-DD')),
      PARTITION P_200106 VALUES LESS THAN (TO_DATE(' 2001-07-01', 'YYYY-MM-DD'))
    );

SH@dwh112> select partition_name, high_value
  2  from user_tab_partitions
  3  where table_name ='T_PART'
  4  order by partition_position; 


PARTITION_NAME  HIGH_VALUE
--------------- ------------------------------------------------------------------------------------
P_200105        TO_DATE(' 2001-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P_200106        TO_DATE(' 2001-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 

The range partitions have been created with the specified upper boundaries.

When we insert rows for which the partition key value is the same or higher than the high value of the last range partition, then
the corresponding interval partitions are created automatically. 

insert into t_part select time_id, CHANNEL_ID, amount_sold from sales where time_id between to_date('01-JUL-2001') and  ('02-JUL-2001');
commit;

PARTITION_NAME  HIGH_VALUE
--------------- -------------------------------------------------------------------------------------
P_200105        TO_DATE(' 2001-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P_200106        TO_DATE(' 2001-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P4168       TO_DATE(' 2001-07-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P4167       TO_DATE(' 2001-07-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')


According to the interval setting, new daily interval partitions have been created with system generated names.

In order to turn an existing the range partitioned table to interval partitioned, execute
 
 ALTER TABLE SET INTERVAL ()

e.g. if the above table was defined as a range partitioned table with 2 range partitions
 
  ...
    PARTITION BY RANGE (col_date)
    (
      PARTITION P_200105 VALUES LESS THAN (TO_DATE(' 2001-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')),
      PARTITION P_200106 VALUES LESS THAN (TO_DATE(' 2001-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    ); 


The following statement would introduce interval partitioning with the same interval as we seen on the previous CREATE TABLE example: 

alter table t_part set INTERVAL(NUMTODSINTERVAL(1, 'DAY'));


The interval must be a fixed value for a particular table at a particular time, but it can be changed.

For example for the above table we can change the interval so that new partition will be created when new month value is inserted: 

alter table t_part SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH'));

  

insert into t_part select time_id, CHANNEL_ID, amount_sold from sales where time_id between to_date('03-JUL-2001') and  ('02-SEP-2001');
commit;

PARTITION_NAME  HIGH_VALUE
--------------- ------------------------------------------------------------------------------------
P_200105        TO_DATE(' 2001-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P_200106        TO_DATE(' 2001-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P4168       TO_DATE(' 2001-07-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P4167       TO_DATE(' 2001-07-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P4170       TO_DATE(' 2001-08-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P4169       TO_DATE(' 2001-09-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 

The high values of the newly created interval partitions reflect the change in interval to MONTH. 

alter table t_part
merge partitions
  for(TO_DATE(' 2001-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')),
  for(TO_DATE(' 2001-07-02 00:00:00', 'SYYYY-MM-DD HH24:MI:SS'))  into partition P_2001_JUL1; 


Note, we specify the partition key value in the FOR clause, the partition where this partition key value falls will be merged.
We could obviously use the partition name instead of the FOR clause,
but being the partition name system generated using partition key value may give us a more generic command. 

PARTITION_NAME  HIGH_VALUE
--------------- ------------------------------------------------------------------------------------
P_200105        TO_DATE(' 2001-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P_200106        TO_DATE(' 2001-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P_2001_JUL1     TO_DATE(' 2001-07-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P4170       TO_DATE(' 2001-08-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P4169       TO_DATE(' 2001-09-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 



We can further merge day partitions, or split, or rename partitions.

e.g. the following renames the SYS_P4169 system generated partition name to P_AUG 

alter table t_part rename partition SYS_P4169 to P_AUG;

PARTITION_NAME  HIGH_VALUE
--------------- ------------------------------------------------------------------------------------
P_200105        TO_DATE(' 2001-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P_200106        TO_DATE(' 2001-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P_2001_JUL1     TO_DATE(' 2001-07-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P4170       TO_DATE(' 2001-08-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P_AUG           TO_DATE(' 2001-09-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 


For complete list of partition maintenance operations and their implications on dependent objects see 
documentation .

We can disable interval partitioning with the following statement:  

 ALTER TABLE t_part SET INTERVAL ();


This makes the table range partitioned with the existing partitions as ranged ones, the INTERVAL clause longer appears in the DDL of the table,
and the system generated partition names SYS_P.. will be used as names of the range partitions

    e.g.
    CREATE TABLE "T_PART"
       (    "COL_DATE" DATE,
            "COL_TEXT" VARCHAR2(100),
            "COL_NUMBER" NUMBER(10,0)
       )
      PARTITION BY RANGE ("COL_DATE")
     (PARTITION "P_200105"  VALUES LESS THAN (TO_DATE(' 2001-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))...,
     PARTITION "P_200106"  VALUES LESS THAN (TO_DATE(' 2001-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ...,
     PARTITION "P_2001_JUL1"  VALUES LESS THAN (TO_DATE(' 2001-07-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) ...,
     PARTITION "SYS_P4170"  VALUES LESS THAN (TO_DATE(' 2001-08-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))...,
    ...

Further examples for interval partitioning can be found in the following sources:
Oracle by Example (ObE) documents:

Knowledge documents: