2023年3月29日 星期三

如何在batch使用管理者權限執行程式

Windows 的權限檢查越來越嚴,所以很多操作都需要使用到管理者的權限。原本我只知道可以用 runas 的方式來執行程式並使用預設的認證,如此就可以使用管理者權限來執行程式,但是這樣會有安全性的問題,因為認證已經儲存,所以也可以被其他惡意的人用同樣的認證來執行任何惡意的行為。

後來才發現有更好的方式,也就是使用 schtasks ,這個指令的功能是執行工作排程器裡面的工作, 相關的指令是下 schtasks /run /tn name-you-gave-the-task-above 。 如此一來你能執行的也只有你預先在排程中設定的工作,密碼也只有這個工作有被設定過,相對來說安全很多。

參考網址: https://superuser.com/questions/581548/runas-savecred-ask-for-password-if-another-user-runs-the-same-batch-file

2017年10月26日 星期四

CRT程式庫與靜態程式庫

最近為了寫一個與IE有關的程式用VC來開發
但是呢,為了將64與32的程式放在一起所以要使用靜態程式庫的方式
因為這兩個要用的DLL同名所以要分開放

找了半天都看不是很懂網路上介紹的方式
後來找到微軟的網頁
才把這個功能搞定, 紀錄一下以免以後忘了
一般來說要使用靜態程式庫要在專案的屬性頁找到執行階段程式庫這個設定


使用/MT 或 /MTd 就可以讓大部份的程式變成不需要額外的DLL就可以執行
因為VC有將大部分的LIB包含進來

但是如果要使用的程式庫不是預設的就要自己加
我要用的是 vcruntime 這個程式庫所以就要查剛剛那個網頁
找到連結器的其他相依性來設定需要用到的 LIB 檔案
如此就可以編譯過了

例外要注意的是除錯版本微軟都有標示不可轉散發
所以為了避免有相關的問題還是使用Release的版本

2016年8月18日 星期四

當程式想要編譯成單一執行檔時需要做以下的設定
1. 將設定裡面 Linker 中的 "Dynamic RTL" 關掉
2. 將設定裡面 Packages 中的 "Link with runtime packages"關掉

但是在 XE10 這樣子是不夠的,
因為這樣做了之後執行程式還是會跳出需要 "BORLNDMM.DLL" 的訊息

有幾個處理辦法
1. 升級成 update1
2. 將設定中的 Use "classic" Borland compiler 關掉
3. 重新產生一個 "memmgr.lib"

第一個辦法因為還要升級費所以不可行..  HotFix也沒出就出Update檔
可以還要買授權, 越來越覺得不該使用Embarcadero了

第二個辦法是關掉後卻會產生其他的 Error, 暫時不想解決這些問題, 所以也不管他

第三個辦法的作法如下
  1. 使用impdef 將 borlndmm.dll 的定義檔匯出成memmgr.def
        impdef memmgr.def borlndmm.dll
  2. 使用編輯軟體編輯memmgr.def
  3. 將以下幾行用分號註解掉
;    __dbk_fcall_wrapper            @2   ; __dbk_fcall_wrapper

;    dbkFCallWrapperAddr            @1   ; dbkFCallWrapperAddr

  4. 使用implib 將 memmgr.def 產生成 memmgr.lib並覆蓋掉舊的
      (舊的記得備份)

C++ Builder 產生單一執行檔的方法

當程式想要編譯成單一執行檔時需要做以下的設定
1. 將設定裡面 Linker 中的 "Dynamic RTL" 關掉
2. 將設定裡面 Packages 中的 "Link with runtime packages"關掉

但是在 XE10 這樣子是不夠的,
因為這樣做了之後執行程式還是會跳出需要 "BORLNDMM.DLL" 的訊息

有幾個處理辦法

1. 升級成 update1
2. 將設定中的 Use "classic" Borland compiler 關掉
3. 重新產生一個 "memmgr.lib"

第一個辦法因為還要升級費所以不可行..  HotFix也沒出就出Update檔

可以還要買授權, 越來越覺得不該使用Embarcadero了

第二個辦法是關掉後卻會產生其他的 Error, 暫時不想解決這些問題, 所以也不管他


第三個辦法的作法如下

  1. 使用impdef 將 borlndmm.dll 的定義檔匯出成memmgr.def
        impdef memmgr.def borlndmm.dll
  2. 使用編輯軟體編輯memmgr.def
  3. 將以下幾行用分號註解掉
;    __dbk_fcall_wrapper            @2   ; __dbk_fcall_wrapper

;    dbkFCallWrapperAddr            @1   ; dbkFCallWrapperAddr

  4. 使用implib 將 memmgr.def 產生成 memmgr.lib並覆蓋掉舊的
      (舊的記得備份)

2016年5月9日 星期一

eclipse 安裝Android SDK 後出現的錯誤

在eclipse安裝了最新的Android SDK的時候就跳出了這個問題,



解決方法1 就是把叫出 Android SDK Manager 把這兩個package刪了

  • Android Wear ARM EABI v7a System Image
  • Android Wear Intel x86 Atom System Image


解決方法2 就是將發生問題的兩個xml內有 " d:skin " 的那一行刪掉, 不過這個我沒試過

2016年2月4日 星期四

IIS7 與 Tomcat整合(use isapi_redirect.dll)

因為想要在一台電腦上同時執行 ASPX 與 JSP
而只能使用80 PORT,
所以只能透過IIS 來轉發 request到tomcat
使用的Tomcat版本是8.0

方法如下:
1.下載 The Apache Tomcat Connectors  我下載的版本是1.2.40
    可以得到 isapi_redirect.dll , 我是放在 c:\tomcat8\bin\

2.設定connector
   根據官網的文件 isapi_redirect 的設定方式有兩種
     (1) registry setting
          在HKLM\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0
          新增最少以下資訊
          extension_uri:/jakarta/isapi_redirect.dll  (固定值)
     log_file: c:/tomcat8/logs/isapi_redirect.log
     log_level: info
     worker_file: c:/tomcat8/conf/workers.properties (workers設定檔的位置)
     worker_mount_file: C:/tomcat8/conf/uriworkermap.properties (uri對照的mapping)

  (2)isapi_redirect.properties
     設定同上, 不過我試的結果是沒有用, 所以用第一種方法
     #固定值
     extension_uri=/jakarta/isapi_redirect.dll
     #log檔放的位置可以依日期來當檔名可以參考官網設定
     log_file=c:/tomcat8/logs/isapi_redirect.log
     #log的記錄內容有 debug, info, warn, error, trace
     log_level=info
     #worker設定檔的位置
     worker_file=c:/tomcat8/conf/workers.properties
     #worker uri mapping對照檔的位置
     worker_mount_file=C:/tomcat8/conf/uriworkermap.properties

3.建立workers.properties文件
  官網worker參數設定
  #隨便設定, 但是要跟等等設定的 uriworkermap.properties一致就好
  worker.list=jspWorker
  #可以是ajp13, ajp14, jni, lb 或是 status 
  #不過以下的設定需要跟server.xml的connector的設定一致
  worker.geloinWorker.type=ajp13
  #tomcat server所在的電腦
  worker.geloinWorker.host=localhost

  worker.geloinWorker.port=8009

4.設定uriworkermap.properties
  詳細設定要參考官網的uri設定
  這邊要跟workers.properties的 worker.list設定一致
  /*.jsp=jspWorker
  /test/*=jspWorker

IIS設定
1.先建立一個跟isapi_redirect.properties的 extension_uri一致的虛擬目錄
  設定到isapi_redirect.dll所在位置
2.設定處理常式對應 -> 編輯功能權限 設為執行

3.為網站新增ISAPI篩選器
4.幫SERVER設定ISAPI及CGI限制新增 JAKARTA
5.記得將W3SVC重啟

參考資料:
1. https://tomcat.apache.org/connectors-doc/
2. http://www.cnblogs.com/meizhouxiang/p/3977474.html

2015年9月30日 星期三

更新工具到C++Builder10 Seattle

最近將開發工具更新到C++Builder Seattle, 原來現在已經不使用make指令來編譯專案
而是改使用微軟提供的MSBuild指令
大致上的作法是先使用 RAD Studio Command Prompt 來使用相關的command line 環境
然後使用 MSBuild XXX.cbproj 就可以使用command line來編譯程式

可以參考以下的資料
MSBuild Overview
Building a Project Using an MSBuild Command
http://ithelp.ithome.com.tw/question/10107277

2015年8月20日 星期四

BCB 對檔案名與路徑字串的函式

取得執行檔的完整路徑
String name = Application->ExeName;
//C:\\Borland\\CBuilder6\\Projects\\Project1.exe

取出檔案名稱
name = ExtractFileName(name);
// Project1.exe

改變副檔名
name = ChangeFileExt(name,".TXT");
//Project1.TXT

取出路徑(含斜線, 不支援反斜線)
name = ExtractFilePath(Application->ExeName);
//C:\Borland\CBuilder6\Projects\

取出路徑(不含斜線, 不支援反斜線)
name = ExtractFileDir(Application->ExeName);
//C:\Borland\CBuilder6\Projects

取出目錄名稱(在linux永遠是空白)
name = ExtractFileDrive(Application->ExeName);
//C:

取出副檔名
name = ExtractFileExt(Application->ExeName);
//.exe

2015年8月17日 星期一

使用command line 來編譯bcb的專案檔

BCB6 可以使用 BCB.exe -m Project.bpr 來編譯執行檔
不過使用這樣的編譯方式在編譯之前會喚起BCB的IDE介面
如果只是單純想編譯程式可以透過MAKE FILE的方式
在BCB3 與BCB4 的時候.bpr檔就是一個makefile文件
自從BCB5 之後 .bpr檔變成了 xml檔案
如果想要 makefile文件的話
可以透過工具程式 bpr2mak.exe Project.mak Project.bpr
來產生 Project.mak

之後再透過指令 make -f Project.mak
就可以編譯檔案了

2015年4月13日 星期一

BCB6 發生 E2015 Ambiguity between 'PLongint' and 'System::Plongint' 錯誤

參考 http://support.embarcadero.com/article/34594 的作法 將Psock.hpp 中的 typedef int *PLongint;註解掉就好了

BCB6.0 使用indy10

1. 首先使用 Administrator 安裝

2. 移除BCB6原來使用的Indy
2.1 放入安裝光碟
2.2 選擇 Modify 後按 Next
2.3 在 Custom Setup 中 選擇 Program Files/Indy 選 Do not Install
2.4 接著就是下一步到結束

3. 安裝新的 Indy
3.1 先開啟BCB6, 這時會發生連結不到 Indy Lib的訊息, 選Yes
3.2 在 Tools/Environment Options/Library Path 中加入Indy的路徑
3.3 在 Project/Options/Packages 加入 dclIndyCore60.bpl 與 dclIndyProtocols60.bpl
3.4 切換到 Directories/Conditionals TAB 在 Include Path 與 Library Path 加入 Indy的目錄(放到第一個)
3.5 記得左下角的 Default要打勾

關閉後重開如果出現找不到 IndySystem60.bpl的訊息, 先按yes 跳過
之後將IndySystem60.bpl, IndyProtocols60.bpl, IndyCore60.bpl放到c:\windows\system32的目錄下

2015年3月24日 星期二

BCB 上使用 GdiPlus (一)

在BCB上如果要使用 Gdi+ 來繪圖必須要先做下面六件事情 1. include 2. using namespace Gdiplus; 3. 宣告全域變數 GdiplusStartupInput m_gdiplusStartupInput; unsigned long m_pGdiToken; 4. 使用前要先呼叫 GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL); 5. 結束的時候呼叫 GdiplusShutdown(m_pGdiToken); 6. 將Gdiplus.lib加入專案 此方法使用靜態鏈結到gdiplus.dll 所以要確認系統有沒有這個檔案, 如果沒有就需要到微軟官網下載. 再使用bcb附的工具程式implib.exe 產生lib檔 implib gdiplus.lib gdiplus.dll

2015年1月12日 星期一

Installshield uninstall 時檔案移除不乾淨

最近幾天使用InstallShield打包程式 一直出現移除程式後目錄殘存檔案的問題 查了很久後才發現 原來是 \\HKEY_LOCAL_MACHINE\SOFTWARE\microsoft\Windows\CurrentVersion\SharedDlls\ 下面記錄了這些檔案的共用狀態 將裡面相關的資料清除後就可以正常移除了

2014年9月30日 星期二

windows command mode 變更檔案目錄權限

舊的系統跟新的系統指令上的差異

XP 使用 cacls.exe

顯示或修改檔案的存取控制清單 (ACL)

CACLS filename [/T] [/M] [/L] [/S[:SDDL]] [/E] [/C] [/G user:perm]
[/R user [...]] [/P user:perm [...]] [/D user [...]]

filename 顯示 ACL。

/T 變更目前目錄與所有子目錄中指定檔案的 ACL。

/L 處理符號連結本身而不是目標

/M 變更掛接到目錄的磁碟區 ACL

/S 顯示 DACL 的 SDDL 字串。

/S:SDDL 以 SDDL 字串中指定的項目取代 ACL
(不能搭配 /E、/G、/R、/P 或 /D 使用)。

/E 編輯 ACL 而不是取代 ACL。

/C 發生拒絕存取錯誤時仍繼續。

/G user:perm 授與指定使用者存取權限。
Perm 可以是 : R 讀取
W 寫入
C 變更 (寫入)
F 完全控制

/R user 撤銷指定使用者的存取權限 (必須與 /E 一起使用)。

/P user:perm 取代指定使用者的存取權限。
Perm 可以是 : N 無
R 讀取
W 寫入
C 變更 (寫入)
F 完全控制

/D user 拒絕指定使用者存取。

可以在命令中使用萬用字元指定一個以上的檔案。
您可以在命令中指定一個以上的使用者。

縮寫:
CI - 容器繼承。
目錄將繼承 ACE。

OI - 物件繼承。
檔案將繼承 ACE。

IO - 僅繼承。
ACE 不會套用到目前的檔案/目錄。

ID - 已繼承。
從父目錄的 ACL 繼承 ACE。


Vista 之後使用 icacls.exe
ICACLS name /save aclfile [/T] [/C] [/L] [/Q]
 將符合名稱之檔案與資料夾的 DACL 儲存至 aclfile,以供稍後與
 /restore 搭配使用。請注意,這不會儲存 SACL、擁有者或完整
 性標籤。

ICACLS directory [/substitute SidOld SidNew [...]] /restore aclfile
[/C] [/L] [/Q]
將儲存的 DACL 套用到目錄中的檔案。

ICACLS name /setowner user [/T] [/C] [/L] [/Q]
變更所有相符名稱的擁有者。此選項不會強制變更擁有權; 如果要強制變更擁有
權,請使用 takeown.exe 公用程式。

ICACLS name /findsid Sid [/T] [/C] [/L] [/Q]
尋找內含明確提及 Sid 之 ACL 的所有相符名稱。

ICACLS name /verify [/T] [/C] [/L] [/Q]
尋找含有未使用標準格式的 ACL 或長度與 ACE 計數不一致的所有檔案。

ICACLS name /reset [/T] [/C] [/L] [/Q]
針對所有符合的檔案,使用預設繼承的 ACL 取代 ACL。

ICACLS name [/grant[:r] Sid:perm[...]]
[/deny Sid:perm [...]]
[/remove[:g|:d]] Sid[...]] [/T] [/C] [/L] [/Q]
[/setintegritylevel Level:policy[...]]

/grant[:r] Sid:perm 授與指定的使用者存取權限。若加上 :r,該權限便會取
代先前授與的明確權限。若不加上 :r,則會將權限加入先前授與的任何明
確權限。

/deny Sid:perm 明確拒絕指定的使用者存取權限。對指定的權限新增明確拒絕的
ACE,並將任何明確授與中的相同權限移除。

/remove[:[g|d]] Sid 會移除 ACL 中 Sid 的所有符合項目。若加上 :g,會將授
與該 Sid 之權限的所有符合項目移除。若加上 :d,則會將拒絕該 Sid 之權
限的所有符合項目移除。

/setintegritylevel [(CI)(OI)]Level 明確地新增完整性 ACE 至所有符合的檔
案。可指定下列層級的其中一個:
L[ow]
M[edium]
H[igh]
完整性 ACE 的繼承選項具有高於層級的優先性,且只會套用到目錄。

/inheritance:e|d|r
e - 啟用繼承
d - 停用繼承並複製 ACE
r - 移除所有繼承的 ACE

注意:
Sid 的格式可以是數字或好記的名稱。如果指定使用數字格式,請在 SID 的開頭
加上 *。

/T 指示要在 name 指定之目錄下的所有相符檔案/目錄上執行此操作。

/C 指示不論發生任何檔案錯誤,都繼續執行此操作。仍會顯示錯誤訊息。

/L 指示此操作會在符號連結 (而非其目標) 上執行。

/Q 指示 icacls 應隱藏成功訊息。

ICACLS 保留 ACE 項目的標準順序:
明確拒絕
明確授與
繼承拒絕
繼承授與

perm 是權限遮罩,可使用下列其中一種格式來指定:
一連串簡單權限:
N - 不允許存取
F - 完整存取權
M - 修改存取權
RX - 讀取和執行存取權
R - 唯讀存取權
W - 唯寫存取權
D - 刪除存取權
在括號中以逗號分隔特定權限的清單:
DE - 刪除
RC - 讀取控制
WDAC - 寫入 DAC
WO - 寫入擁有者
S - 同步
AS - 存取系統安全性
MA - 允許的最大值
GR - 一般讀取
GW - 一般寫入
GE - 一般執行
GA - 一般所有權限
RD - 讀取資料/列出目錄
WD - 寫入資料/新增檔案
AD - 附加資料/新增子目錄
REA - 讀取擴充屬性
WEA - 寫入擴充屬性
X - 執行/周遊
DC - 刪除子系
RA - 讀取屬性
WA - 寫入屬性
繼承權限的優先順序高於上述任一種格式,且僅套用到目錄:
(OI) - 物件繼承
(CI) - 容器繼承
(IO) - 僅繼承
(NP) - 不傳播繼承
(I) - 從父容器繼承的權限

範例:

icacls c:\windows\* /save AclFile /T
- 會將 c:\windows 及其子目錄下所有檔案的 ACL 儲存到 AclFile。

icacls c:\windows\ /restore AclFile
- 會還原 AclFile 之中每個檔案的 Acl,而 AclFile 位於 c:\windows 及其子目錄下。

icacls file /grant Administrator:(D,WDAC)
- 會將檔案的刪除和寫入 DAC 權限授與使用者 Administrator。

icacls file /grant *S-1-1-0:(D,WDAC)
- 會將檔案的刪除和寫入 DAC 權限授與 sid S-1-1-0 所定義的使用者。
只是不知道為什麼我使用 icacls 的時候不管設定 :F完整存取權, 還是其它的, 權限都會被清空, 只剩下特殊存取權限
後來經同事測試, 要用 :(OI)(CI)F 這樣才會有完整存取權

2014年9月25日 星期四

取得作業系統版本資訊

利用WINDOWS API 取得相關資訊
可以參考 GetVersionEx() function

得到的結構參考 OSVERSIONINFOEX

這次是為了取得是否是 Win7 以上的版本
相關的Code如下


bool  IsWindows7OrGreater()
{
    OSVERSIONINFO info;
    GetVersionEx(&info);

    return info.dwMajorVersion>=6;
}



2014年9月23日 星期二

Android 4.2.2 開啟 開發人員選項 的方法

  1. 首先先到 [設定]  ->  [關於手機]  ->  [版本號碼] 的地方
  2. 在 [版本號碼] 的地方連點7-10下
  3. 在 [設定] -> [系統] 的地方就會出現 [開發人員選項]

2014年9月18日 星期四

InstallShield 2012 Sprint 使用筆記

Custom Actions:
  1. 新增Kill Process的時候, 並沒有地方設定要kill的process name,這時候就要到 Behavior and Logic ->  Property Manager 去新增一筆 ISTerminateProcesses,  Value 設為要kill 的程式名, 多筆的時候用分號隔開,  exp: a.exe;b.exe  參考網址
  2. 如果要在移除的時候執行指定的動作我目前的 Sequence 設定是將 Install Exec Sequence 設成 After SetARPINSTALLLOCATION,  Condition 設為 REMOVE="ALL"



2014年5月22日 星期四

2014年4月14日 星期一

Services程式與一般程式之間共享資訊

主要是透過Share Memory的方式建立可以共同存取的記憶體
這樣A可以寫入資訊讓B去讀取, 彼此溝通

Process A:

HANDLE hFile;
char writeBuffer[128]={0};
LPCTSTR pBuf;          
char szFileName[]="Global\\Test";
SECURITY_ATTRIBUTES security;
ZeroMemory(&security, sizeof(security));
security.nLength = sizeof(security);
ConvertStringSecurityDescriptorToSecurityDescriptor(
         "D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)",
         SDDL_REVISION_1, &security.lpSecurityDescriptor,NULL);

hFile = CreateFileMapping((HANDLE)0xFFFFFFFF,&security,PAGE_READWRITE,0,sizeof(writeBuffer),szFileName  );

pBuf = (LPCTSTR)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,sizeof(writeBuffer));
strcat((char*)pBuf,"This is a Share Memory!!");
CloseHandle(hFile);


Process B:

char szFileName[]="Global\\Test";
Char writeBuffer[128]={0};
LPCTSTR pBuf;
HANDLE hFile;
hFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szFileName);
pBuf=(LPCTSTR)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,sizeof(writeBuffer));
if(strlen(pBuf))
    Edit1->Text = pBuf;
CloseHandle(hFile);



特別要注意的是紅色部分是 Service 要加入的部分, 透過這樣設定DACL授予普通用戶讀取權限的記憶體共享, 如果需要寫入的話, 要將 GR改成GWGR, 只是, 請注意, 這樣是不安全的!!

參考網頁:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx
http://stackoverflow.com/questions/898683/how-to-share-memory-between-services-and-user-processes
http://msdn.microsoft.com/en-us/library/windows/desktop/aa376401(v=vs.85).aspx

2014年2月17日 星期一

BCB6 Warring W8058 Cannot create pre-compiled header: write failed

出現這個問題的時候是因為
Option-》Compiler-》Pre-compiled Headers 下面的FileName 設定路徑不存在