Triển khai Máy in qua GPO / GPP - có tùy chọn lập trình không?


10

Vì những lý do ngoài tầm kiểm soát của tôi, tôi đã được giao nhiệm vụ thiết lập GPO / GPP để triển khai hơn 100 máy in cho hơn 1000 khách hàng của chúng tôi.

Tin vui là chúng tôi có hơn một chục trang web và phần lớn, tôi được phép đẩy tất cả các máy in tại trang X sang tất cả các PC khách tại trang X.

Tin xấu là hai cách tôi biết cách thực hiện ( "Triển khai với Chính sách nhóm ...", từ máy chủ in "sử dụng GPP / Tùy chọn chính sách nhóm ) liên quan đến công việc thủ công nhiều hơn tôi sẵn sàng Điều này nhiều máy in. Tôi thậm chí dường như không thể chọn tất cả các máy in trên máy chủ in và sử dụng Deploy with Group Policy...tùy chọn, ví dụ - nó hy vọng tôi sẽ làm điều đó từng cái một, điều đó sẽ không xảy ra. , vì nó hy vọng tôi chọn đường dẫn của máy in từ máy chủ in và sau đó bấm thủ công một loạt thông tin (như IP máy in) mà nó có thể nhận được từ kết nối máy in.

Google-Fu của tôi cho một tập lệnh để thêm tất cả các máy in trên máy chủ in vào GPO / GPP trở nên trống rỗng và dường như tôi không thể thấy một cách khác để làm điều này ngay cả trong thời trang bán tự động, nhưng tôi vẫn gắn bó với niềm tin rằng tôi đang thiếu một cái gì đó, bởi vì không có cách nào mà bất kỳ người lành mạnh nào sẽ chọn tự thêm hàng trăm máy in vào GPO.

Lý tưởng nhất là tôi muốn tìm một cách lập trình để sử dụng GPP, nhưng trong mọi trường hợp, bất kỳ giải pháp nào không liên quan đến hàng chục giờ thêm máy in thủ công sẽ rất tuyệt.

Có ai có cách để làm điều này không, hoặc tôi sẽ cần phải xây dựng một tập lệnh PowerShell và / hoặc lừa một cấp dưới thực hiện việc này?


1
Như tôi đã đề cập với bạn trong cuộc trò chuyện đầu ngày hôm nay, có một giao diện COM để tạo và liên kết các GPO theo chương trình ... tất cả bắt đầu bằng một cái gì đó như $GPM = New-Object -ComObject GPMgmt.Gpm. Tôi nghĩ rằng giao diện đó, trong khi là một con lợn tuyệt đối để làm việc, có thể cung cấp cho bạn một phương thức có thể hỗ trợ hơn một chút so với việc đơn giản là hack một số XML xuất hiện và có mùi giống như một GPO thực sự. Không ai thích COM mặc dù. Ít nhất là tất cả chúng ta Powersheller.
Ryan Ries

1
@RyanRies Vâng, tôi vẫn đang đá nó một vòng trong tâm trí của tôi, và một trong những điều tôi chưa quyết định là liệu kịch bản của tôi có cần được hỗ trợ hay không, hoặc chỉ là một điều duy nhất để thiết lập nó trong địa điểm đầu tiên. Chắc chắn tôi sẽ đăng nó ở đây, bất cứ điều gì tôi kết thúc.
HoplessN00b

Khi bạn nói rằng bạn cần triển khai 100 máy in, điều đó không có nghĩa là tất cả các máy tính (1..1000) nên có tất cả 100 máy in, phải không?
Adil Hindistan

1
@AdilHindistan Số Mỗi máy tính sẽ nhận được tất cả các máy in có sẵn tại trang web của mình. (Nhiều hơn hoặc ít hơn.) Nhưng tách chúng ra không phải là phần khó. Việc đưa máy in vào GPO ở nơi đầu tiên hóa ra là một nỗi đau nhiều hơn bạn nghĩ.
HoplessN00b

Câu trả lời:


7

Tôi đã googled khá khó khăn, và thậm chí còn đùa giỡn với backup-GPOhy vọng có thể hack tệp XML kết quả và nhập lại nó, nhưng tôi nghi ngờ rằng một kịch bản PowerShell là trong tương lai của bạn.

Nó không tệ. Bạn có thể tạo danh sách máy in từ máy chủ gần nhất và sau đó lặp qua đó và ánh xạ chúng.

Một cái gì đó như thế này:

$net = New-Object -COMObject WScript.Network
$printserver = 'yourserver'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist) 
{
    $printerpath = '\\' + $printserver + '\' + $printer.ShareName
    #echo $printerpath
    $net.AddWindowsPrinterConnection($printerpath)
}

Nếu máy in được đặt tên là những thứ hợp lý và có một số cách hợp lý để xác định máy, bạn có thể tinh chỉnh nó nhiều hơn. Tôi đã từng chọn máy chủ gần nhất dựa trên việc lấy địa chỉ IP của máy khách chẳng hạn. Nếu địa chỉ IP như 10.20. *, Hãy truy cập server1. Vân vân.

Tôi hy vọng điều đó sẽ giúp.

Biên tập:

Nhìn vào tài liệu của @ EvanAnderson, tôi khá chắc chắn rằng XML có thể hack được.

Bit có liên quan của tệp đã xuất của tôi (có giao dịch):

<DSObject bkp:Path="CN={GUIDHERE},CN=PushedPrinterConnections,%GPO_MACH_DSPATH%" bkp:SourceExpandedPath="CN={13B9B596-452C-4652-A05D-78EF06610134},CN=PushedPrinterConnections,CN=Machine,CN={44A99FBA-0DB3-484C-808E-3DDAE9932A2B},CN=Policies,CN=System,DC=Domainname,DC=extension" bkp:ObjectClass="msPrint-ConnectionPolicy">
    <DSAttributeMultiString bkp:DSAttrName="showInAdvancedViewOnly">
        <DSValue><![CDATA[TRUE]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="uNCName">
        <DSValue><![CDATA[\\Servername\PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="serverName">
        <DSValue><![CDATA[\\Servername]]></DSValue></DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printAttributes">
        <DSValue><![CDATA[0]]></DSValue>
    </DSAttributeMultiString>
    <DSAttributeMultiString bkp:DSAttrName="printerName">
        <DSValue><![CDATA[PrinterShareName]]></DSValue>
    </DSAttributeMultiString>
</DSObject>

Đó là một câu trả lời tốt (và cuối cùng tôi có thể sử dụng một cái gì đó như thế này để đáp ứng một số thời hạn của chúng tôi), nhưng tôi nghi ngờ rằng một thực tập sinh hoặc cấp dưới trong tương lai của câu hỏi này, thực sự, vì chúng tôi được yêu cầu sử dụng GPO / GPP để chỉ định Máy in tại một số điểm. Và trong khi một kịch bản đăng nhập PS sẽ phù hợp về mặt kỹ thuật với yêu cầu đó, tôi hy vọng rằng ban quản lý sẽ giao dịch với tôi đủ để khiến nó không đáng để tôi làm theo cách đó.
HoplessN00b

Than ôi. :( Các lệnh ghép ngắn quyền hạn GPO dường như sao lưu, khôi phục, tạo các đối tượng trống ... nhưng không thêm vào GPO. Các đối tượng XML có chính sách máy in trông hoàn toàn có thể hack được ngoại trừ GUID.
Kinda Villyard 17/214

1
Vâng, không có công cụ của bên thứ 3, tự động hóa GPO / GPP qua PowerShell khá đau đớn. Tôi đã tìm thấy thứ gì đó trông khá tốt , tiết kiệm vì thực tế là nó yêu cầu bộ phần mềm của bên thứ 3 mà chúng tôi có thể sẽ không được phép mua ... vì vậy, nó có thể sẽ là một số tập lệnh như bạn chỉnh sửa XML trong trang web cụ thể hiện có GPO ... mà tôi tưởng tượng tôi sẽ đăng ở đây sau khi tôi hoàn thành.
HoplessN00b

8

Theo quan điểm của Powershell về Chính sách nhóm sẽ thu hút các sản phẩm của bên thứ ba (thương mại).

Tôi nghĩ rằng bạn đang bị mắc kẹt trong XML (hoặc bằng HTML nếu bạn thích ) trong Đối tượng chính sách nhóm để làm những gì bạn đang tìm kiếm.

May mắn thay , XML trông không đáng sợ . Giá trị UID trên mỗi máy in (mà tôi tin là những gì @KindaVillyard đang đề cập trong nhận xét của cô ấy) chỉ là một GUID ngẫu nhiên được tạo cho mỗi máy in được tham chiếu trong XML.

Đây là một số mã Powershell mẫu, được mô phỏng một cách đáng xấu hổ theo mã của Kinda:

@"
<?xml version="1.0" encoding="utf-8"?>
<Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}" disabled="0">
"@

$net = New-Object -COMObject WScript.Network
$printserver = 'print-server'

$printerlist = Get-WMIObject -class Win32_Printer -computer $printserver | Where-Object {$_.ShareName -ne $null} | Select-Object ShareName
foreach ($printer in $printerlist) 
{
    $date = Get-Date
    echo '  <SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}"'
    '    name="' + $printer.ShareName + '"' | echo
    '    status="' + $printer.ShareName + '"' | echo
    echo '    image="2"'
    '    changed="' + $date + '"' | echo
    $ng = [GUID]::NewGuid().ToString('B')
    '    uid="' + $ng + '">' | echo

    echo '    <Properties'
    echo '      action="R"'
    echo '      comment=""'
    '      path="\\' + $printserver + '\' + $printer.ShareName + '"' | echo
    echo '      location=""'
    echo '      default="1"' 
    echo '      skipLocal="1"'
    echo '      deleteAll="0"'
    echo '      persistent="0"'
    echo '      deleteMaps="0"'
    echo '      port=""/>'
    echo '  </SharedPrinter>'
}

@"
</Printers>
"@

(Tôi viết mã Powershell thực sự, thực sự xấu xí.)

Tôi chưa thực sự cố gắng để GPP CSE phân tích cú pháp XML này. XML ít nhất xác nhận.

Tôi bắt đầu suy nghĩ về việc viết một số điều quái dị bằng cách sử dụng Get-GPOvà phân tích GUID để đến đường dẫn hệ thống tập tin cho GPO trong SYSVOL, nhưng, cho rằng tôi cần phải thực hiện một số công việc thực sự vào tối nay, tôi nghĩ rằng tôi sẽ rời đi đó như là một bài tập cho người đọc. > mỉm cười <Tuy nhiên, nó rất khả thi.


Nếu đó là một GUID ngẫu nhiên, nó chắc chắn có thể hack được. Tôi chỉ cập nhật của tôi, quá. Heh.
Kinda Villyard

Sửa đổi XML trong bản sao lưu Chính sách nhóm chắc chắn sẽ hoạt động, nhưng thay đổi "sống" trong SYSVOL cũng có thể khả thi (với điều kiện là cả hai đều dũng cảm, ngu ngốc hoặc, giống như tôi, cả hai). Vì tôi có công việc thực sự phải làm vào tối nay (và vì tôi đã trở lại @ewwhite cho bảng xếp hạng đại diện trong quý này một lần nữa) Tôi nghĩ rằng tôi sẽ lưu tải khẩu súng đặc biệt đó và chĩa nó vào chân họ cho người khác. > cười khúc khích <
Evan Anderson

Tôi dũng cảm, nhưng tôi không dũng cảm. ;) Tạo tệp, kiểm tra nhập tệp trong môi trường thử nghiệm, v.v.
Kinda Villyard

2
Powershell thực sự cần nhiều tùy chọn GPO hơn. Get-Link, Set-Link, New-GPO và Set-GPORegistry chưa thực sự đủ tốt ...
Mark Henderson

Các lệnh PowerShell tích hợp đôi khi không đủ. Trong trường hợp đó, tôi sẽ đề nghị xem xét 'Giải pháp của GPO Guy. Anh ấy có một công ty: sdmsoftware.com
Adil

0

Gần đây tôi đã thực hiện một dự án tương tự và sau khi xem xét phương pháp đẩy GPO tốt so với GPP mới hơn so với kịch bản, tôi đã chọn kịch bản toàn bộ. Tôi không biết cái gì sẽ làm việc tốt nhất cho bạn nhưng đây là một vài con trỏ cho bạn:

  • Sử dụng lý tưởng ứng dụng khách có HĐH mới (Windows 8/2012 +) để kết nối với máy chủ in và nhận thông tin Máy in từ Máy chủ In:

    Get-Máy in-Máy tính PrintServerName

  • Sử dụng các nhóm AD Security để ánh xạ hàng đợi in tới máy tính. Vì vậy, giả sử bạn có một hàng đợi in (bạn đã tập hợp từ lệnh trên) có tên \ PrintServer1 \ MyColorPrinter123, tạo một nhóm bảo mật như máy in.group.PrintServer1.MyColorPrinter123 và thêm các máy tính vào nhóm đó

  • Trong tập lệnh khởi động, có chức năng kiểm tra tư cách thành viên nhóm của máy tính khi sắp ra mắt và xem nó có phải là một phần của bất kỳ nhóm máy in nào không. Nếu có, hãy sử dụng các lệnh printui.exe (hoặc printui.dll) tích hợp để ánh xạ máy in như thế này

    Gọi-Expression 'rundll32 printui.dll, PrintUIEntry / ga / n "\ PrintServer1 \ MyColorPrinter123" / q'

  • Khi máy tính hoạt động, dịch vụ bộ đệm in sẽ đẩy 'kết nối in', đó là những gì GPO đã từng làm, cho bất kỳ người dùng nào sẽ đăng nhập.

Bạn có thể đi chi tiết hơn rất nhiều ** nhưng ở mức độ cao đó là những gì nó cần.

** Tôi đã tạo một GUI cho phép người dùng (thực sự là kỹ thuật viên) chọn bất kỳ Máy chủ in nào và nó cung cấp cho họ danh sách máy in trên máy chủ đó. Nếu họ chọn một, họ có thể thấy tất cả các thuộc tính của nó. Thông tin đó đến từ Get-Printer tôi đã đề cập ở trên. Nếu bạn xuất dữ liệu đó dưới dạng csv, thì bạn có thể sử dụng lại dữ liệu đó để hiển thị thông tin ..

** Các kỹ thuật viên sử dụng GUI đó để gửi yêu cầu thêm máy tính vào máy in mà nó được cho là sẽ kết nối. Đây là một 'yêu cầu', vì họ không có quyền trong AD.

** Một tập lệnh phụ trợ đơn giản xem thư mục và thêm máy tính vào nhóm máy in mà tôi đã đề cập ở trên. Vì vậy, nếu bạn đã biết ai nên lấy máy in nào, thật tuyệt, bạn có thể dễ dàng làm điều đó. Thêm máy tính vào nhóm là một công việc đơn giản với AD Cmdlets.

** Bạn cũng có thể lên lịch công việc để kiểm tra các máy chủ in để xem có hàng đợi in mới nào không, và so sánh chúng với các nhóm AD của bạn.

Vì vậy, việc tạo ra một giải pháp 'được quản lý' có một chút liên quan, nhưng thật dễ dàng để bắt đầu với những điều cơ bản và tiếp tục thêm vào để có một hệ thống rất linh hoạt, dễ sử dụng không liên quan đến GPO ... chỉ cần một chút PowerShell

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.