2019年11月19日 星期二

VMWare ESXi 6.5 VLAN 串接 CISCO Port-channel 設定

CISCO Switch 設定
設定 Port-channel 時最好不要接網路線或者把一個 Port shutdown,以免造成 loop
#config terminal
(config)#interface gi1/0/1
(config-if)#channel-group 1 mode on
(config-if)#switchport mode trunk

(config-if)#interface gi1/0/2
(config-if)#channel-group 1 mode on
(config-if)#switchport mode trunk

(config-if)#interface po1
(config-if)#switchport mode trunk

檢查 Switch witch 設定,確認 interface gi1/0/1、interface gi1/0/2 和 Port-channel1 是否為 up
#show ip interface brief

#show etherchannel summary
Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
1      Po1(SU)          -        Gi1/0/1(P)  Gi1/0/2(P)

#show interface po1
Port-channel1 is up, line protocol is up (connected) 
  Hardware is EtherChannel, address is 2222.3333.4444 (bia 2222.3333.4444)
  Description: VM_LAB
  MTU 1500 bytes, BW 2000000 Kbit/sec, DLY 10 usec,
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation ARPA, loopback not set
  Keepalive set (10 sec)
  Full-duplex, 1000Mb/s, link type is auto, media type is unknown
  input flow-control is off, output flow-control is unsupported
  Members in this channel: Gi1/0/1 Gi1/0/2


VMware ESXi vSwitch 設定
新增 vSwitch 設定,按【新增上行】可加入多張網路介面到 vSwitch

負載平衡 欄位需選擇【根據 IP 雜湊進行路由


VMware ESXi  VLAN ID 設定
新增 VLAN 連接群組

要新增多個連接埠,重複上圖步驟即可加入多個VLAN到Trunk_vSwitch裡。

設定好的 VLAN 欄位值



如果沒有其他設備的問題,依上面步驟就可設定好 VMWare ESXi VLAN 串接 CISCO Port-channel

我自己是遇到 CISCO Switch 的 VTP mode 被設定為 Server,找了好久才找到問題!!!!!!!!!




2019年5月16日 星期四

Office 365修改單一使用者的OneDrive儲存空間



1.      下載、安裝SharePoint Online套件


2.      輸入連線指令

$adminUPN="hansen@sample.com.tw"

$orgName="sample"

$userCredential = Get-Credential -UserName $adminUPN -Message "Type the password."

Connect-SPOService -Url https://$orgName-admin.sharepoint.com -Credential $userCredential

3.      開啟 Office 365 管理網頁,切換到【使用者】、【作用中使用者】,選擇要修改OneDrive空間的使用者


4.      設定此一使用者OneDrive空間容量為 1T(1048567) 或 5T(5242880),依訂閱的類型可用的儲存空間也不同。
Set-SPOSite -Identity https://sample-my.sharepoint.com/personal/kings01_sample_com_tw -StorageQuota 5242880


2019年4月5日 星期五

釋放 iPhone 記憶體(RAM)

引用網友的小祕訣:
在 iPhone 快速運作過程中,需要記憶體作為暫時存放程式、指令或資料的地方,用來提昇整體的效能。你可能會發現當你開越多 App 在背景執行 iPhone 會變得越來越卡,就是記憶體不足的關係。

快速釋放記憶體操作方式:
1. 長按電源鍵至滑動關機頁面
2. 接著長按 Home 鍵並等待回復至桌面即可自動釋放記憶體。

2019年1月3日 星期四

Office 2019 離線安裝程式下載

Office 2019 不支援 Windows 7、Windows 8 的作業系統,相信大家早已知道。

另外一變動是大量授權的商業用戶以往要下載安裝程式時,只要登入 VLSC 網頁,就可以下載已購買的軟體 ISO 檔。

但現在商業用戶要下載 Office 2019 的安裝程式,在 VLSC 網頁內只能找到一支 Office 部署工具程式(Microsoft下載中心也能下載Office部署工具)。使用者要離線安裝 Office 2019,就要先自己使用部署工具程式下載 Office 2019 軟體。

從下載的 Office部署工具解壓縮後會看到兩個 xml 配置檔(內容預設是 Office 365 的配置設定)及一支 setup.exe。使用前先修改 xml 配置檔以符合購買的授權版本。

微軟也提供快速產生 XML 配置檔的設定網頁:

這裡有一點要注意,配置檔內最好不要有中文字。
我自己在下載時,配置檔內有中文時依然可以正常下載 Office 2019 程式,
但在安裝時確一直無法成功安裝。

以下是 『Office 2019 Standard 32位元 繁中』的 XML 配置檔內容:
<Configuration>
  <Add OfficeClientEdition="32" Channel="PerpetualVL2019" AllowCdnFallback="FALSE" ForceUpgrade="TRUE">
    <Product ID="Standard2019Volume">
      <Language ID="zh-tw" />
      <ExcludeApp ID="OneNote" />
      <ExcludeApp ID="Groove" />
      <ExcludeApp ID="OneDrive" />
      <ExcludeApp ID="Publisher" />
      <ExcludeApp ID="Outlook" />
    </Product>
  </Add>
  <Property Name="SharedComputerLicensing" Value="0" />
  <Property Name="PinIconsToTaskbar" Value="TRUE" />
  <Property Name="SCLCacheOverride" Value="0" />
  <Property Name="AUTOACTIVATE" Value="0" />
  <Updates Enabled="TRUE" Channel="PerpetualVL2019" />
  <Logging Level="Off" />
</Configuration>

XML 配置檔設定方式可參考下列微軟網站提供的資訊:

修改好 xml 配置檔就可以開始下載 Office 2019 程式:
1.先將 xml 和 setup.exe 存放在同一目錄
2.以「系統管理員身份執行」開啟一個【命令提示字元】視窗
3.切換到該目錄執行下列指令:
setup.exe /download Office2019std_x86.xml
setup.exe /download Office2019std_x64.xml

4.下載後為了方便安裝,可以建立一個簡單的批次執行檔,輸入:
setup.exe /configure Office2019std_x64.xml

這裡要注意的是:
1.安裝程式放在NAS裡時,必需要連線成網路磁碟,才能正常安裝成功
2.安裝時,電腦的網路必需要能正常連線 Internet

Office 2019 for Mac 可直接於微軟網站下載 pkg 檔的安裝程式:


2018年6月5日 星期二

OCS Inventory 匯出資料到 Google 試算表(依電腦設備類型)

OCS Inventory 匯出到 Google 試算表的程式是從網路上其他高手分享出來(參考資料出處),並依個人需求調整。

如要取用請注意,因程式是用 python 寫的,程式段落可能會移位導致無法正常運作。

下列程式調整SELECT電腦設備類型為Notebook寫入試算表分頁。

程式內容:
#coding=utf-8
#-*- coding: utf-8 -*-
import MySQLdb as mysqldb
import sys
import gspread
import string

def DB_return(exec_cmd):
    connection = mysqldb.connect('localhost', 'ocs', 'ocspasswd', 'ocsdb',charset='utf8');
    with connection:
        cursor = connection.cursor()
        cursor.execute(exec_cmd)
        rows_info = cursor.fetchall()
        return rows_info

def GSheet_write(GSpreadSheet,GDriveJSON,tab_data,data,worksheet_name):

    a_list=[]
    for i, element in enumerate(tab_data):
        a_list.append(tab_data[i])
    a_tup = tuple(a_list)

    start_row = 1
    start_letter = 'A'
    end_len = len(data[0]) - 1
    if end_len > 26:
        len_info = end_len - 26
        len_a='A'
    else:
        len_info = end_len
        len_a=''
    end_letter = string.uppercase[len_info]
    end_letter = len_a+end_letter
    end_row = len(data)
    range = "%s%d:%s%d" % (start_letter, start_row+1 , end_letter, end_row+1)
    range_tab =  "%s%d:%s%d" % (start_letter, start_row , end_letter ,start_row)

    from oauth2client.service_account import ServiceAccountCredentials as SAC
    try:
        scope = ['https://spreadsheets.google.com/feeds']
        key = SAC.from_json_keyfile_name(GDriveJSON, scope)
        gc = gspread.authorize(key)
        workbook = gc.open(GSpreadSheet)

        if worksheet_name in [sheet.title for sheet in workbook.worksheets()]:
          workbook.del_worksheet(workbook.worksheet(worksheet_name))
          wks = workbook.add_worksheet(worksheet_name,end_row+1,end_len+1)
        else:
          wks = workbook.add_worksheet(worksheet_name,end_row+1,end_len+1)
    except Exception as ex:
        print('connect google fail ', ex)
        sys.exit(1)

    cell_list = wks.range(range)

    try:
        idx = 0
        for (start_row , rowlist) in enumerate(data):
            for (colnum, value) in enumerate(rowlist):
                cell_list[idx].value = value
                idx += 1
                if idx >= len(cell_list):
                    break
        wks.update_cells(cell_list)
    except:
        print "Exception"


    cell_list_tab = wks.range(range_tab)

    try:
        idx = 0
        for (start_row , value) in enumerate(a_tup):
            cell_list_tab[idx].value = value
            idx += 1
            if idx >= len(cell_list_tab):
                break
        wks.update_cells(cell_list_tab)
    except:
        print "Exception"



GDriveJSON = 'GoogleAuthKey.json'
GSpreadSheet = '試算表檔名'
TYPE = 'Notebook'

rows_item = ['HardwareID', 'UserName', 'Computer', 'Type', 'CPU', 'RAM(MB)', 'Disk(MB)', 'Monitor']
rows_accest = DB_return("SELECT DISTINCT  A.HARDWARE_ID,A.TAG,H.NAME,B.TYPE,H.PROCESSORT,H.MEMORY,S.DISKSIZE,M.CAPTION \
from \
accountinfo as A \
join hardware as H \
join monitors as M \
join storages as S \
join softwares as SF \
join bios as B \
where \
A.HARDWARE_ID=H.ID \
and A.HARDWARE_ID=S.HARDWARE_ID \
and A.HARDWARE_ID=B.HARDWARE_ID \
and S.TYPE='Fixed hard disk media' \
and A.HARDWARE_ID=M.HARDWARE_ID \
and A.HARDWARE_ID=SF.HARDWARE_ID \
and A.HARDWARE_ID=H.ID \
and A.TAG not like '%報廢%' \
and A.TAG not like '%出售%' \
and B.TYPE='" + TYPE + "' GROUP BY A.TAG")

GSheet_write(GSpreadSheet,GDriveJSON,rows_item,rows_accest,TYPE)



OCS Inventory 匯出資料到 Google 試算表(依TAG名稱寫入試算表不同分頁)

OCS Inventory 匯出到 Google 試算表的程式是從網路上其他高手分享出來(參考資料出處),並依個人需求調整。

如要取用請注意,因程式是用 python 寫的,程式段落可能會移位導致無法正常運作。

下列程式調整為依電腦設備寫入同算表不同分頁,過濾掉電腦上所安裝不想列出的系統修補軟體。

程式內容:
#coding=utf-8
#-*- coding: utf-8 -*-
import MySQLdb as mysqldb
import sys
import gspread
import string

def DB_return(exec_cmd):
    connection = mysqldb.connect('localhost', 'ocs', 'ocspasswd', 'ocsdb',charset='utf8');
    with connection:
        cursor = connection.cursor()
        cursor.execute(exec_cmd)
        rows_info = cursor.fetchall()
        return rows_info

def GSheet_write(GSpreadSheet,GDriveJSON,tab_data,data,worksheet_name):
    a_list=[]
    for i, element in enumerate(tab_data):
        a_list.append(tab_data[i])
    a_tup = tuple(a_list)

    start_row = 1
    start_letter = 'A'
    end_len = len(data[0]) - 1
    if end_len > 26:
        len_info = end_len - 26
        len_a='A'
    else:
        len_info = end_len
        len_a=''
    end_letter = string.uppercase[len_info]
    end_letter = len_a+end_letter
    end_row = len(data)
    range = "%s%d:%s%d" % (start_letter, start_row+1 , end_letter, end_row+1)
    range_tab =  "%s%d:%s%d" % (start_letter, start_row , end_letter ,start_row)

    from oauth2client.service_account import ServiceAccountCredentials as SAC
    try:
        scope = ['https://spreadsheets.google.com/feeds']
        key = SAC.from_json_keyfile_name(GDriveJSON, scope)
        gc = gspread.authorize(key)
        workbook = gc.open(GSpreadSheet)
        if worksheet_name in [sheet.title for sheet in workbook.worksheets()]:
          workbook.del_worksheet(workbook.worksheet(worksheet_name))
          wks = workbook.add_worksheet(worksheet_name,end_row+1,end_len+1)
        else:
          wks = workbook.add_worksheet(worksheet_name,end_row+1,end_len+1)
    except Exception as ex:
        print('connect google fail ', ex)
        sys.exit(1)

    cell_list = wks.range(range)

    try:
        idx = 0
        for (start_row , rowlist) in enumerate(data):
            for (colnum, value) in enumerate(rowlist):
                cell_list[idx].value = value
                idx += 1
                if idx >= len(cell_list):
                    break
        wks.update_cells(cell_list)
    except:
        print "Exception"


    cell_list_tab = wks.range(range_tab)

    try:
        idx = 0
        for (start_row , value) in enumerate(a_tup):
            cell_list_tab[idx].value = value
            idx += 1
            if idx >= len(cell_list_tab):
                break
        wks.update_cells(cell_list_tab)
    except:
        print "Exception"



GDriveJSON = 'GoogleAuthKey.json'
GSpreadSheet = '試算表檔名'

rows_item = ['HardwareID', 'UserName', 'Computer', 'CPU', 'RAM(MB)', 'HD_Model', 'HD_Size(MB)', 'Monitor', 'Software']

connection = mysqldb.connect('localhost', 'ocs', 'ocspasswd', 'ocsdb',charset='utf8');
with connection:
    cursor = connection.cursor()
    cursor.execute("select * from accountinfo where TAG not like '%出售%' and TAG not like '%報廢%'")
    numrows = int(cursor.rowcount)

    for i in range(numrows):
        row = cursor.fetchone()
        GsheetName = row[1]

        reload(sys)
        sys.setdefaultencoding('utf-8')

        rows_accest = DB_return("SELECT DISTINCT \
A.HARDWARE_ID,A.TAG,H.NAME,H.PROCESSORT,H.MEMORY,S.NAME,S.DISKSIZE,M.CAPTION,SF.NAME \
from accountinfo as A \
join hardware as H \
join monitors as M \
join storages as S \
join softwares as SF \
where \
A.HARDWARE_ID=H.ID \
and A.HARDWARE_ID=S.HARDWARE_ID \
and S.TYPE='Fixed hard disk media' \
and A.HARDWARE_ID=M.HARDWARE_ID \
and A.HARDWARE_ID=SF.HARDWARE_ID \
and A.HARDWARE_ID=H.ID \
and SF.NAME not like '%Hotfix%' \
and SF.NAME not like '%Update%' \
and SF.NAME not like '%安全性更新%' \
and SF.NAME not like '%更新%' \
and SF.NAME not like '%驅動程式%' \
and A.TAG like '" + GsheetName + "' \
ORDER BY H.NAME")

        GSheet_write(GSpreadSheet,GDriveJSON,rows_item,rows_accest,GsheetName)



2017年9月20日 星期三

OFFICE 表格內的文字消失

微軟9月份的Office軟體更新後會造成表格合併儲存格的文字消失,還沒更新的就先不要更新。

已經安裝的也有解決辦法,將已更新的 KB3213656 或 KB4011039 修正檔移除就可恢復正常了。

VMWare ESXi 6.5 VLAN 串接 CISCO Port-channel 設定

CISCO Switch 設定 設定 Port-channel 時最好 不要接網路線 或者 把一個 Port shutdown ,以免造成 loop # config terminal (config)# interface gi1/0/1 (config-if)# ch...