星期一, 9月 27, 2010

無法用WMI遠端連線到未加入網域XP電腦

Wmi 遠端連線到電腦時,有時候會常常access deny出現!
當然有可能是你帳號打錯(自作孽ㄟ( ̄□ ̄ )ㄏ)

我測試了WIN2003、2008、XP、Win7 。XP的電腦卻大部分都無法連線成功!

大部分出現的訊息都是︰
2010年9月27日 PM 12:36:36 - 連線到192.168.1.112發生錯誤,錯誤訊息:存取被拒。 (發生例外狀況於 HRESULT: 0x80070005 (E_ACCESSDENIED))
2010年9月27日 PM 12:37:33 - 連線到192.168.1.112發生錯誤,錯誤訊息:存取被拒。 (發生例外狀況於 HRESULT: 0x80070005 (E_ACCESSDENIED))
雖然之前就在MSDN裡面有大概喵了一下WMI的架構,及遠端連線的Security,參考自︰
Dcom的權限設定,WMI的權限設定
結果還是不OK,碰到XP就是掛掉,試了快兩天還是Deny狂出現
一直以為是程式碼的問題,將以下的Com設定也按照msdn security的方法去試,結果還是失敗

//取得或設定 COM 模擬等級
remoteCon.Impersonation = ImpersonationLevel.Impersonate;
//如果為NULL,則已電腦的網域為預設值
remoteCon.Authority = "ntdlmdomain:domain"; 
//取得或設定 COM 驗證等級,以使用於這個連接中的作業。
remoteCon.Authentication = AuthenticationLevel.PacketPrivacy;
//指出是否需要為連接作業啟用使用者權限。在執行的作業需要啟用某些使用者權限時 (例如,電腦重新開機) 才應該使用這個屬性。 
 remoteCon.EnablePrivileges = true;

星期二, 9月 21, 2010

ScrollBar在 DataGridView能顯現

程式好弱.......一堆東西看完書還是不懂的運用!!
廢話不多說.....我只會抱怨@@

最近在做datatable裡的資料binding到datagridview上,
由於資料會更新, 所以必須隨時Update到datagridview上,
但是又不想UI Thread卡死,
所以用新Thread去跑data,要更新時再去Invoke,讓主執行緒能更新畫面

 //對控制項更新狀態
        delegate void UpdateGridViewlHandle();
        delegate void UpdateLabellHandle(int over,int count);
        private void UpdateGridView()
        {
            customDataGridView1.Refresh();
        }
        private void UpdateLabel(int over,int count)
        {
            stateLabel.Text = "處理中…,失敗 "+getFailed+" 筆…";
        } 

星期一, 9月 13, 2010

讀取Registry Value(WMI)

 這邊要順便紀錄如何使用WMI呼叫Method

  • 先建立連線 Remote 連線

//建立遠端連線
ConnectionOptions remoteCon = new ConnectionOptions();
remoteCon.Username =Account;
remoteCon.Password = Password;
//如果為NULL,則已電腦的網域為預設值
//remoteCon.Authority = "ntdlmdomain:DOMAIN"; 
//取得或設定 COM 驗證等級,以使用於這個連接中的作業。
remoteCon.Authentication = AuthenticationLevel.PacketPrivacy;
//指出是否需要為連接作業啟用使用者權限。在執行的作業需要啟用某些使用者權限時 (例如,電腦重新開機) 才應該使用這個屬性。 
remoteCon.EnablePrivileges = true;  

星期二, 8月 10, 2010

Winform & Thread 筆記

在Winform 使用執行 Thread存取控制項,發生以下錯誤
{"跨執行緒作業無效: 存取控制項 'listBox1' 時所使用的執行緒與建立控制項的執行緒不同。"}

星期三, 8月 04, 2010

Linq 與IEnumerable 介面

架 構上而言,只要是實作IEnumerable介面的物件,皆可做為LINQ To Objects的資料來源,那如果只是實作了IEnumerable介面的物件呢?以.NET Framework 1.1時我們常用的ArrayList來說,是否也能做為LINQ To Objects的資料來源呢?答案是肯定的,透過LINQ To Objects所提供的Cast或是OfType函式,我們可以輕易的將ArrayList轉變為實作IEnumerable介面的物 件,進而將IEnumerable介面的物件運用於LINQ To Objects中。

System.Linq提供的擴充功能
public static IEnumerable Cast(
 this IEnumerable source
)

型別參數

TResult
要將 source 之項目轉換成的型別。

參數

source
型別:System.Collections.IEnumerable 包含要轉換之項目的 IEnumerable
參考:http://www.dotblogs.com.tw/code6421/archive/2008/05/07/3890.aspx

c# 使用WMI

利用WMI 可以輕鬆取得電腦裡面許多相關的資訊
常用的Win32類別可以在msdn查詢相關資料
http://msdn.microsoft.com/en-us/library/aa394084%28v=VS.85%29.aspx 

System.Management提供了幾種常用的Class來取得WMI相關訊息  
  • ObjectQuery
  • ManagementObjectSearcher
  • ManagementObjectCollection
  • ManagementObject   
  • ManagementClass
以下兩個通常用在遠端查詢的時候使用
  • ConnectionOptions 
  • ManagementScope

星期二, 8月 03, 2010

DataGridView加入欄位

原本想要從datagridview利用Add增加Row,利用dataSource去回寫XML,但結果果然不行。
出現了︰
當控制項已繫結資料時,無法以程式設計的方式將資料列加入 DataGridView 的資料列集合。

xmlDataSet.ReadXml(@"d:\test.xml");
this.dataGridView1.DataSource = xmlDataSet;

this.dataGridView1.Rows.Add(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text);

 改成由dataSet 去作修改在Update dataGridView就OK!!


 xmlDataSet.Tables["pc"].Rows.Add(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text);

  this.dataGridView1.Update();