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 修正檔移除就可恢復正常了。

2017年8月19日 星期六

OFFICE 365 搭配 Linux BIND DNS 設定

OFFICE 365 DNS網域設定方式(For Linux)

在Zone設定檔裡增加O365 網域 DNS記錄
新增下列DNS記錄:

;o365 SubDomain
$ORIGIN o365.example.com.tw.

;O365用來驗證網域是否歸您所有
o365.example.com.tw. 3600 IN TXT "MS=ms12345678"

增加上面兩列設定就可完成OFFICE 365的網域驗證。

; 將網域的內送郵件傳送到 Office 365 中的 Exchange Online 服務
o365.example.com.tw. 3600 IN MX 5 o365-example-com-tw.mail.protection.outlook.com.

; 防止他人使用您的網域來傳送垃圾郵件或其他惡意電子郵件
o365.example.com.tw. 3600 IN TXT "v=spf1 include:spf.protection.outlook.com -all"

;O365各項服務主機的DNS記錄
;自動導引outlook用戶端與Exchange Online連結
autodiscover.o365.example.com.tw. 3600 IN CNAME autodiscover.outlook.com.

; Lync用戶端會使用它來協助尋找 Lync Online 服務並登入
sip.o365.example.com.tw. 3600 IN CNAME sipdir.online.lync.com.

; Lync 行動用戶端會使用它來協助尋找 Lync Online 服務並登入
lyncdiscover.o365.example.com.tw. 3600 IN CNAME webdir.online.lync.com.

; Office 365 會使用它來將驗證導向正確的身份識別平台
msoid.o365.example.com.tw. 3600 IN CNAME clientconfig.microsoftonline-p.net.

; Office 365 行動裝置管理 (MDM)
enterpriseregistration.o365.example.com.tw. 3600 IN CNAME enterpriseregistration.windows.net.

; Office 365 行動裝置管理 (MDM)
enterpriseenrollment.o365.example.com.tw. 3600 IN CNAME enterpriseenrollment.manage.microsoft.com.

;協調 Lync 用戶端之間的資訊流程
_sip._tls.o365.example.com.tw. 3600 IN SRV 100 1 443 sipdir.online.lync.com.

;藉由啟用 SIP 同盟,讓 Office 365 網域與 Skype 之外的用戶端共用
_sipfederationtls._tcp.o365.example.com.tw. 3600 IN SRV 100 1 5061 sipfed.online.lync.com.

如郵件寄送是使用主網域(example.com.tw)來寄送信件,也需在主網域(example.com.tw)設定上列設定值(注意:網域名需修改為主網域,例: o365.example.com.tw --> example.com.tw)。



2017年7月21日 星期五

iRedMail Server 主機、DB 備份還原


因為發生慘案,先趕快將 iRedMail Server 還原後回想的還原步驟,可能會漏掉還原過程中少數步驟。但有大部份的還原步驟總比沒有好,有機會..................吔!!!!!
希望不會再有機會用到。


安裝時,有可能系統採最小安裝,會缺少某些 compile 工具程式,依提示補上即可。

一、安裝 CentOS 或 Ubuntu、iRedMail
1.安裝 CentOS 或 Ubuntu


2.下載 iRedMail:
請選擇最新版本下載:
https://bitbucket.org/zhb/iredmail/downloads/
tar -xvf iRedMail-x.x.x.tar.bz2
cd iRedMail-x.x.x
bash iRedMail.sh


3.iRedMail 固定的設定畫面,依它的設定步驟提供各項資料設定。
設定過程中要先建立一個 domain(如有多個 Domain 挑一個預設的 Domain)、MySQL 密碼、管理者帳號密碼(帳號預設為:postmaster@domain_name)。


4.安裝 Let’s Encrypt(這篇是講還原,所以沒有安裝後續修改 Apache、nginx 的設定方式)
yum install -y git bc wget


git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt


/opt/letsencrypt/letsencrypt-auto certonly --standalone --email xxx@example.com --agree-tos -d example.com (可利用 -d 加多個Domain)


自動更新 SSL 憑證設定檔:
cp /opt/letsencrypt/examples/cli.ini /usr/local/etc/le-renew-webroot.ini


編輯自訂設定檔(沒備份到):
vi /usr/local/etc/le-renew-webroot.ini
修改(必須和原來申請SSL KEY填的資料一樣,不然就利用上面的步驟重新申請 SSL):
rsa-key-size = 4096
email = xxxxx@example.com
domains = example1.com, example2.com …………..
webroot-path = /opt/www/    #roundcubemail 安裝目錄


下載 SSL 更新程式:
yum install curl
curl -L -o /usr/local/sbin/le-renew-webroot https://gist.githubusercontent.com/thisismitch/e1b603165523df66d5cc/raw/fbffbf358e96110d5566f13677d9bd5f4f65794c/le-renew-webroot


手動執行,測試 shell script 更新憑證 :
/usr/local/sbin/le-renew-webroot


加入 Crontab 排程執行憑證更新 :
crontab -e
設定每個禮拜一的凌晨 2:30 (排程自訂)進行一次憑證的檢查及更新
30 2 * * Mon /usr/local/sbin/le-renew-webroot >> /var/log/le-renewal.log;systemctl restart nginx.service postfix.service dovecot.service
這樣就有了一個半永久的 SSL 憑證


二、還原設定
1.從備份的 etc 資料夾複製  letsencrypt 資料夾到 /etc 下


2.還原 postfix 設定檔:
main.cf(確認 main.cf 裡是否有另外套件的設定資料檔案,如有一併還原)
master.cf


3.還原 dovecot.conf 設定檔(LOG 檔 owner 為:vmail:vmail)


4.還原 nginx.conf、conf.d/default.conf
PS:
連線時出現: 502 bad gateway 有可能是 nginx.conf 裡的
server unix:/var/run/php-fpm.socket 路徑指向錯誤


5.產生新的 DKIM KEY(檔案路徑在 /var/lib/dkim,沒備份到)
amavisd -c /etc/amavisd/amavisd.conf genrsa /var/lib/dkim/example.com.pem 2048
chown amavis:amavis /var/lib/dkim/example.com.pem
chmod 400 /var/lib/dkim/example.com.pem
systemctl restart amavisd


檢查:
amavisd -c /etc/amavisd/amavisd.conf showkeys
amavisd -u amavis -c /etc/amavisd/amavisd.conf debug


記得修改 DNS DKIM 設定。


6.修改 amavisd.conf,增加 Domain (公司有多個網域都要加入,另不要用舊的設定檔,除非版本相同)


7.還原備份的 vmail1 裡的使用者信箱(直接搬移 各個 Domain 資料夾進 /var/vmail/vmail1/)


8.還原 MySQL DB
先解壓縮 iRedMail 備份的 DB:
zip2 -d xxxxxxx

還原 DB:
mysql -uroot -p amavisd < amavisd-2017-07-20-03\:30\:08.sql
mysql -uroot -p iredadmin < iredadmin-2017-07-20-03\:30\:08.sql
mysql -uroot -p iredapd < iredapd-2017-07-20-03\:30\:08.sql
mysql -uroot -p roundcubemail < roundcubemail-2017-07-20-03\:30\:08.sql
mysql -uroot -p vmail < vmail-2017-07-20-03\:30\:08.sql
還回以上的 DB 即可,切勿還原 sql DB

9.觀察 LOG 看是否有錯誤訊息



2017年6月30日 星期五

ownCloud 掛載 Google Drive、DropBox

Google 端設定:
1.要申請 Google API 認證 key 前,Chrome 先登入要申請的 Gmail 帳號

2.申請 Google API key 網址


3.這裡是申請 ownCloud 讀取 Google Drive 的認證 key

選擇啟用 Google Drive API

出現要建立專案的提示

建立專案

專案成功建立後,再選擇啟用 Google Drive API

建立 憑證




要不要下載 JSON 認證檔案都沒關係,可從網頁內查詢得到

完成的畫面

ownCloud 端設定:

出現錯誤訊息頁面:
表示要先加入 Google 的  Allow Risky Access Permissions By Unreviewed Apps 群組

加入群組後,再回到 ownCloud 按<允許存取>重新連結 Google Drive 一次。
重新連結就會出現:

ownCloud 成功加上 Google Drive 後,就可以退出 Allow Risky Access Permissions By Unreviewed Apps 群組了。

DropBox APPS 認證 KEY 網頁:

DropBox 的作法更簡單,目前 ownCloud v10 只支援 OAuth1 認證。

按 Create app 後,就產生一組認證 KEY & 金鑰


DropBox 二個步驟搞定,再到 ownCloud 儲存區掛載 DropBox 空間。

新增 DropBox 儲存區,輸入 APP key 及 金鑰後,按<允許存取>






Office 2019 離線安裝程式下載

Office 2019 不支援 Windows 7、Windows 8 的作業系統,相信大家早已知道。 另外一變動是大量授權的商業用戶以往要下載安裝程式時,只要登入 VLSC 網頁,就可以下載已購買的軟體 ISO 檔。 但現在商業用戶要下載 Office 2019...